簡體   English   中英

SQL Server:遍歷每一行,將遞增的值添加到列

[英]SQL Server : loop through every row, add incremented value to column

我剛剛在MyTable添加了新列Person_Id_Helper 它應該包含1,2,3等,按表現在排序的順序。

這就是我想做的:

DECLARE @i INT = 1, @NumberOfRows INT = SELECT COUNT(*) FROM MyTable 

WHILE(@i <= @NumberOfRows)
BEGIN
   -- Person_Id_Helper = @i
   -- @i = @i + 1       
END

我該怎么寫?

我認為,將排序對象保留在列中可能是錯誤的想法。 但是-當然可以! -在while循環中執行此操作是錯誤的想法。

閱讀有關基於行和基於集的方法。 SQL對基於集合的思維的要求...

以此為例,了解如何執行此操作(只需將其粘貼到一個空的查詢窗口中並執行,以適應您的需要):

DECLARE @tbl TABLE(SortDate DATE, Inx INT);
INSERT INTO @tbl VALUES({d'2016-01-20'},0)
                      ,({d'2016-01-19'},0)
                      ,({d'2016-01-14'},0)
                      ,({d'2016-01-16'},0);
WITH cte AS
(
       SELECT Inx,ROW_NUMBER() OVER(ORDER BY SortDate) AS RN
       FROM @tbl
)
UPDATE cte SET Inx=RN;

SELECT * FROM @tbl;

我認為這是您想要實現的目標-

DECLARE @i INT = 0
UPDATE MyTable
SET 
   @i = Person_Id_Helper = @i + 1

現在檢查您的列值。

好吧,我們不能在更新語句中使用ORDER BY子句。 但是在這里使用它是更新的查詢。

UPDATE t
SET Person_Id_Helper = rn.RowNum
FROM MyTable t
INNER JOIN (SELECT
        ID
        ,ROW_NUMBER() OVER (ORDER BY ID) AS RowNum
    FROM MyTable) rn
    ON t.ID = rn.ID

@shungo:謝謝指出。

這樣嘗試

DECLARE @tbl TABLE
  (
     datecolumn DATE,
     Person_Id_Helper  INT
  );

INSERT INTO @tbl
VALUES     ({d'2016-01-20'},
            0),
            ({d'2016-01-19'},
             0),
            ({d'2016-01-14'},
             0),
            ({d'2016-01-16'},
             0);

SELECT *
FROM   @tbl;

UPDATE T
SET    Person_Id_Helper = rn
FROM   (SELECT Person_Id_Helper,
               Row_number()
                 OVER(
                   ORDER BY datecolumn) AS rn
        FROM   @tbl) T

SELECT *
FROM   @tbl;

在此處輸入圖片說明 循環使用sqlserver中的游標添加增量值

 CREATE TABLE [dbo].[Table1](
    [PID] [int] NULL,
    [ProductDesc] [nvarchar](50) NULL,
    [ProductCode] [nvarchar](10) NULL
) ON [PRIMARY]


GO
INSERT [dbo].[Table1] ([PID], [ProductDesc], [ProductCode], [Person_Id_Helper]) VALUES (1, N'Packet-Eye', N'P001', NULL)
GO
INSERT [dbo].[Table1] ([PID], [ProductDesc], [ProductCode], [Person_Id_Helper]) VALUES (2, N'Wiggy', N'W099 ', NULL)
GO
INSERT [dbo].[Table1] ([PID], [ProductDesc], [ProductCode], [Person_Id_Helper]) VALUES (3, N'Wimax-Lite', N'W001', NULL)
GO
INSERT [dbo].[Table1] ([PID], [ProductDesc], [ProductCode], [Person_Id_Helper]) VALUES (4, N'Wimax-Home', N'e W002 ', NULL)
GO

Declare @count int
DECLARE @PID int 
set @count=0
DECLARE c1 CURSOR READ_ONLY
FOR 
SELECT [PID] FROM [Table1] 
OPEN c1 
FETCH NEXT FROM c1 INTO @PID 
WHILE @@FETCH_STATUS = 0 
BEGIN 
set @count=@count+1
update Table1 set Person_Id_Helper=@count where [PID]=@PID
FETCH NEXT FROM c1 INTO @PID END 
CLOSE c1 
DEALLOCATE c1

select * from Table1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM