Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何遍历SQL结果集并更新记录?_C#_Sql_Stored Procedures - Fatal编程技术网

C# 如何遍历SQL结果集并更新记录?

C# 如何遍历SQL结果集并更新记录?,c#,sql,stored-procedures,C#,Sql,Stored Procedures,我有一个用于对列重新排序的系统。我有一个允许用户禁用列的函数。这会在数据库中将其列顺序设置为null,并将其设置为disabled,但我需要能够更新ColumnOrder列,以使用新顺序更新其余启用的记录 下面是我禁用“Cust TYPE”后的表,您可以看到,我现在还有4条启用的记录,但我需要给它们新的列序号1,2,3,4(不需要5): 以下是启用或禁用记录的过程: IF EXISTS ( SELECT [Enabled?] FROM dbo.CustomerLo

我有一个用于对列重新排序的系统。我有一个允许用户禁用列的函数。这会在数据库中将其列顺序设置为null,并将其设置为disabled,但我需要能够更新ColumnOrder列,以使用新顺序更新其余启用的记录

下面是我禁用“Cust TYPE”后的表,您可以看到,我现在还有4条启用的记录,但我需要给它们新的列序号1,2,3,4(不需要5):

以下是启用或禁用记录的过程:

IF EXISTS ( SELECT [Enabled?]
                FROM dbo.CustomerLocalizationColumns CLC
                INNER JOIN Portal.dbo.Columns C
                    ON CLC.ColumnID = C.ID
                WHERE UserID = @UserID
                    AND ColumnID = @ColumnID
                    AND CLC.[Enabled?] = 0 )
    BEGIN
        UPDATE dbo.CustomerLocalizationColumns
            SET [Enabled?] = 1
                ,ColumnOrder = (
                                SELECT COUNT(*) + 1
                                    FROM dbo.CustomerLocalizationColumns
                                    WHERE [Enabled?] = 1
                                )
            WHERE (
                    SELECT [Enabled?]
                        FROM dbo.CustomerLocalizationColumns CLC
                        INNER JOIN Portal.dbo.Columns C
                            ON CLC.ColumnID = C.ID
                        WHERE UserID = @UserID
                            AND ColumnID = @ColumnID
                    ) = 0
                AND dbo.CustomerLocalizationColumns.UserID = @UserID
                AND dbo.CustomerLocalizationColumns.ColumnID = @ColumnID
    END
ELSE
    BEGIN
        UPDATE dbo.CustomerLocalizationColumns
            SET [Enabled?] = 0
                ,ColumnOrder = NULL
            WHERE (
                    SELECT [Enabled?]
                        FROM dbo.CustomerLocalizationColumns CLC
                        INNER JOIN Portal.dbo.Columns C
                            ON CLC.ColumnID = C.ID
                        WHERE UserID = @UserID
                            AND ColumnID = @ColumnID
                    ) = 1
                AND dbo.CustomerLocalizationColumns.UserID = @UserID
                AND dbo.CustomerLocalizationColumns.ColumnID = @ColumnID
    END
END 
试试这个。。 我可以使用
ROWNUMBER()
为非空列生成新列顺序,然后在同一过程中将其更新到表中

    WITH CTE
        AS (
            SELECT *
                , ROW_NUMBER() OVER (
                    ORDER BY columnorder
                    ) ROWNUM
            FROM CustomerLocalizationColumns
            WHERE columnorder IS NOT NULL
           --Could also use Enabled=1
            )
        UPDATE A
        SET columnorder = rownum
        FROM CustomerLocalizationColumns A
        INNER JOIN CTE
            ON A.Columnid = CTE.Columnid
            WHERE columnorder IS NOT NULL
            --Could also use Enabled=1;
端到端示例:

DECLARE @tble TABLE (
    Columnid VARCHAR(30)
    , columnorder INT
    )
insert into @tble
SELECT 'a', 1 UNION all
SELECT 'b', 2 UNION all
SELECT 'c', NULL UNION all
SELECT 'd', 6 UNION all
SELECT 'e', NULL UNION all
SELECT 'f', 8
--BEFORE UPDATE
SELECT *
FROM @tble;

--UPDATING
WITH CTE
AS (
    SELECT *
        , ROW_NUMBER() OVER (
            ORDER BY columnorder
            ) ROWNUM
    FROM @tble
    WHERE columnorder IS NOT NULL
    )
UPDATE A
SET columnorder = rownum
FROM @tble A
INNER JOIN CTE
    ON A.Columnid = CTE.Columnid;

--AFTER UPDATE
SELECT *
FROM @tble;
我用它来测试:

CREATE TABLE #CustomerLocalizationColumns 
(ID INT, ColumnOrder INT, [Enabled?] INT);

With Data as
(SELECT 50 as ID, 1 as ColumnOrder, 1 as [Enabled?] UNION ALL
 SELECT 51,0,0 UNION ALL
 SELECT 52,2,1 UNION ALL
 SELECT 53,0,0 UNION ALL
 SELECT 54,4,1 UNION ALL
 SELECT 55,5,1 UNION ALL
 SELECT 56,0,0 UNION ALL
 SELECT 57,0,0
)
INSERT INTO #CustomerLocalizationColumns
SELECT * FROM Data;

-- because I used 0 instead of NULLs in a hurry (and it lines up nicely!) :)
UPDATE #CustomerLocalizationColumns
SET ColumnOrder=NULL
WHERE [Enabled?] = 0

UPDATE #CustomerLocalizationColumns
SET ColumnOrder = test
FROM #CustomerLocalizationColumns
  RIGHT OUTER JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) as test FROM #CustomerLocalizationColumns
   WHERE [Enabled?]=1) as enabledrows ON #CustomerLocalizationColumns.ID=enabledrows.ID

SELECT * FROM #CustomerLocalizationColumns;
DROP TABLE #CustomerLocalizationColumns
UPDATE CustomerLocalizationColumns
SET ColumnOrder = new_num
FROM CustomerLocalizationColumns
  LEFT OUTER JOIN 
    (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) as new_num
     FROM CustomerLocalizationColumns
     WHERE [Enabled?]=1
    ) as enabledrows
       ON CustomerLocalizationColumns.ID=enabledrows.ID
CREATE TABLE #CustomerLocalizationColumns 
(ID INT, ColumnOrder INT, [Enabled?] INT);

With Data as
(SELECT 50 as ID, 1 as ColumnOrder, 1 as [Enabled?] UNION ALL
 SELECT 51,0,0 UNION ALL
 SELECT 52,2,1 UNION ALL
 SELECT 53,0,0 UNION ALL
 SELECT 54,4,1 UNION ALL
 SELECT 55,5,1 UNION ALL
 SELECT 56,0,0 UNION ALL
 SELECT 57,0,0
)
INSERT INTO #CustomerLocalizationColumns
SELECT * FROM Data;

-- because I used 0 instead of NULLs in a hurry (and it lines up nicely!) :)
UPDATE #CustomerLocalizationColumns
SET ColumnOrder=NULL
WHERE [Enabled?] = 0

UPDATE #CustomerLocalizationColumns
SET ColumnOrder = test
FROM #CustomerLocalizationColumns
  RIGHT OUTER JOIN (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) as test FROM #CustomerLocalizationColumns
   WHERE [Enabled?]=1) as enabledrows ON #CustomerLocalizationColumns.ID=enabledrows.ID

SELECT * FROM #CustomerLocalizationColumns;
DROP TABLE #CustomerLocalizationColumns