【问题标题】:How to update selective rows in a table in sql server?如何更新 sql server 表中的选择性行?
【发布时间】:2012-10-25 02:45:31
【问题描述】:

我正在一个应用程序中工作,在该应用程序中,用户通过单击与每一行关联的复选框来选择网格视图中的一些行,并且在选定的行中,只有一个值应该在数据库中更新。 我正在使用以下查询

 update Items
 set bitIsTab = 1
 where ReqID = 3

假设用户从 gridview 中选择了 4 个值,我必须将这 4 行 bitIsTab 设置为 1。如何通过调用一次查询来更新这些行,或者我必须调用与所选记录数一样多的相同查询.

【问题讨论】:

    标签: c# asp.net sql


    【解决方案1】:

    如果你知道ReqIDs 你可以这样做

    update Items
    set bitIsTab = 1
    where ReqID in (1,2,3,4)
    

    【讨论】:

    • 但是如何将多个 ReqID 作为参数传递给 ReqID 总数不固定的过程?
    • @AG - 您可以将 IEnumerable 传递给过程
    • @FrancisP - 我假设该方法是 OP 的方法,而不是 LINQ/EF 的东西。因此,在 OP 的方法中,您传递 IEnumerable 并构建直接查询。
    【解决方案2】:

    好的,查询应该如下所示,以更新项目 1、2、3、4:

     UPDATE Items
     SET bitIsTab = 1
     WHERE ReqID IN (1,2,3,4);
    

    但是可以使用Linq:

    List<int> selectedIds = { 1, 2, 3, 4 };
    var itemsToBeUpdated = (from i in yourContext.Items 
                            where selectedIds.Contains(i.ReqID)
                            select i);
    itemsToBeUpdated.ForEach(i=>i.bitIsTab = 1);
    yourContext.SubmitChanges();
    

    或者您可以在存储过程中使用VARCHAR:

    CREATE PROCEDURE sp_setTabItems
        @ids varchar(500) AS
     UPDATE Items
     SET bitIsTab = 1
     WHERE charindex(',' + ReqID + ',', ',' + @ids + ',') > 0;
    

    然后使用“1,2,3,4”作为你的存储过程参数。

    执行存储过程:

     EXEC sp_setTabItems '1,2,3,4'
    

    也可以以更可重用的方式完成,将bitIsTab 作为参数:

    CREATE PROCEDURE sp_setTabItems
        @isTab bit,
        @ids varchar(500) AS
     UPDATE Items
     SET bitIsTab = @isTab 
     WHERE charindex(',' + ReqID + ',', ',' + @ids + ',') > 0;
    

    并以这种方式执行:

    EXEC sp_setTabItems '1,2,3,4',1
    

    我更新了存储过程解决方案,因为将 INT 与 VARCHAR 进行比较不适用于 EXEC。

    【讨论】:

      【解决方案3】:

      一个简单的解决方案是

       DECLARE @id varchar(30)
       SET @id = '1,3,2'
      
       UPDATE [Items]
       SET bitIsTab = 0
       WHERE ReqID IN (
                          SELECT s
                          FROM dbo.Split(',', @id)
                      )
      

      在哪里

       CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
       RETURNS table
       AS
       RETURN (
       WITH Pieces(pn, start, stop) AS (
       SELECT 1, 1, CHARINDEX(@sep, @s)
       UNION ALL
       SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
       FROM Pieces
       WHERE stop > 0
       )
       SELECT pn,
       SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
       FROM Pieces
       )
      

      【讨论】:

        【解决方案4】:

        如果您必须将数据作为分隔 ID 列表传递,那么您需要为 how to split and insert CSV data into a new table in single statement? 编写一个函数

         CREATE PROCEDURE sp_setTabItems
            @ids varchar(500) -- 1,2,4,6
         AS
         UPDATE Items
         SET bitIsTab = 1
         WHERE ReqID IN (Select Part From dbo.inline_split_me(@ids)
        

        这里是函数

        CREATE FUNCTION inline_split_me (@SplitOn char(1),@String varchar(7998))
        RETURNS TABLE AS
            RETURN (WITH SplitSting AS
               (SELECT
                    LEFT(@String,CHARINDEX(@SplitOn,@String)-1) AS Part
                        ,RIGHT(@String,LEN(@String)-CHARINDEX(@SplitOn,@String)) AS Remainder
                    WHERE @String IS NOT NULL AND CHARINDEX(@SplitOn,@String)>0
                UNION ALL
                SELECT
                    LEFT(Remainder,CHARINDEX(@SplitOn,Remainder)-1)
                        ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(@SplitOn,Remainder))
                    FROM SplitSting
                    WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)>0
                UNION ALL
                SELECT
                    Remainder,null
                    FROM SplitSting
                    WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)=0
               )
               SELECT Part FROM SplitSting
           )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-01
          • 1970-01-01
          相关资源
          最近更新 更多