【问题标题】:One stored procedure to update whole table or individual columns too一个存储过程也可以更新整个表或单个列
【发布时间】:2013-04-01 06:59:19
【问题描述】:

我有一张表 userdata,其中包含以下列:

userId
userName
userEmail
userContact
userDob
userAdd
userImage
userPass

我正在使用存储过程从该表中选择数据。

现在我想用一个存储过程更新这个表。我可以使用存储过程更新此表,但我的要求是 profile.aspx 我允许用户使用存储过程更新所有列。但在其他形式中,我希望用户只更新几列,例如在setting.aspx 页面上,我只允许用户更新userPass 列。

所以我必须创建另一个存储过程。我有很多这样的桌子。我想知道我必须创建多少存储过程来更新具有不同列的许多表。

任何人都可以建议一种简短的方法,以便我可以使用每个表只使用一个存储过程来更新整个表或单个列,或者任何 c# 代码来缩短它吗?

提前致谢

【问题讨论】:

  • 建议尝试创建一个可以在一个过程中更新部分或所有列的单个存储过程。这将是一个庞大、混乱、复杂、难以理解和难以维护的过程!不要这样做——这不值得。要么你需要 x 存储过程来满足你的 x 更新场景 - 要么你使用像实体框架这样的 ORM 来避免编写大量的过程......

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

您可以在 MS SQL Server 中使用ISNULL 函数,这在 MSDN 的以下语句中进行了解释。

用指定的替换值替换 NULL。

您可以编写一个存储过程,在各种操作中更新您要更新的所有字段。从所有页面调用相同的过程。然后从一个页面只传递该页面的相关参数,其余参数(与该页面无关)传递null

你的存储过程应该是这样的

UPDATE dbo.userTable SET
userName = ISNull(@userName, userName),
userEmail= ISNull(@userEmail, userEmail),
-- list of all your table fields goes here
WHERE userID = @userID

如果你传递参数,这将做的是;它将更新该字段的值;如果您为任何字段传递null,它将使用其现有值更新该字段。这样该字段在更新操作中不会受到影响。

【讨论】:

    【解决方案2】:

    您可以使用具有多个if.. else.. 条件的单个存储过程来控制每个字段的更新。然后您可以将它们作为参数传递以控制要更新的字段。

    【讨论】:

      【解决方案3】:

      我认为你可以这样做: 在首页,您应该将不想更新的字段设置为不可编辑,但将值作为参数传递给存储过程。在 store-procedure 中,将这些字段的旧值设置为对应的参数,如果不相等,则更新它,否则,对这些字段不做任何事情。

      【讨论】:

        【解决方案4】:

        你可以使用这样的东西:

        UPDATE tbl t
           SET t.userName =  CASE WHEN @userName  IS NULL THEN t.userName  ELSE @userName  END
             , t.userEmail = CASE WHEN @userEmail IS NULL THEN t.userEmail ELSE @userEmail END
             ,  ...
           WHERE t.userName = CASE WHEN @WHERE_userName IS NULL THEN t.userName ELSE @WHERE_userName END
             AND ...
        

        因此,如果您不想更新特定字段,只需将代码中的 DBNull.Value 传递给该参数的过程调用即可。 请记住,这仅在您不打算使用 NULL 值更新字段时才有效。 如果您需要空值,则可以重写一点代码以使其与空值一起使用。如果您需要进一步的帮助,请发表评论。

        【讨论】:

        • 感谢 bugartist.. 这似乎是我所期待的.. 让我试试.. 会回复你.. 真的谢谢
        【解决方案5】:

        在 Datatable 中获取您需要更新的所有数据。 使用 datatable.WriteXML 方法并在 Stream 对象中获取所有字符串,使用 XmlWriteMode.IgnoreSchema 仅获取数据。

                DataTable dt = new DataTable();
                dt.WriteXml(stream object ,XmlWriteMode.IgnoreSchema)
        

        现在创建接受 Varchar(max) 参数的过程并将 Stream 对象传递给过程。

        之后,您就可以使用 Openxml 或在 Sqlserver 的 XML 变量中获取所有这些内容 获取@tablevariable 或#temp 表中的所有数据。

        Openxml in sqlserver 或者 For Xml for XMl variable

        然后您将在一张表中获取所有内容,使用该表更新您的 基于主键 ID 的数据库表 喜欢....

        SQl qquery 如下所示

        Update "Database Table Name"
        set .........
        from "GetDatafromc#table"
        

        【讨论】:

          猜你喜欢
          • 2012-01-17
          • 1970-01-01
          • 1970-01-01
          • 2020-12-14
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多