[英]how to loop through table and set cell equal to an incremented value in sql
[英]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;
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.