2016-01-20 81 views
0

我也只是增加了一個新的列,Person_Id_HelperMyTable。它應該包含1,2,3等,按照表格現在的排序順序。SQL服務器:遍歷每一行,增加的值添加到

這就是我想做的事:

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

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

我怎麼寫?

+1

@PeterSmith NO!動態SQL **主要**不好,CURSOR ** **非常糟糕。動態PIVOT或與性能相關的特殊情況需要動態SQL。有**非常罕見的事情,你真的需要一個光標來解決它... – Shnugo

+1

這就是爲什麼我upvoted你的答案。我刪除了我的評論!謝謝 –

回答

2

我認爲這是你想實現 -

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:謝謝指出。

+1

沒有排序這將是隨機的......有**絕對沒有隱式排序順序** – Shnugo

+0

其實,這工作正如我想要的!新手也很容易理解。我會盡可能接受答案。謝謝! – hellogoodnight

+0

@hellogoodnight,它在你身上 - 當然! - 決定哪一個最適合你。但請注意 - 從技術角度來看 - 這種解決方案非常糟糕。你不能依靠你的表目前似乎有任何排序順序...... – Shnugo

4

我認爲,在列中保留排序或排序可能是錯誤的想法。但是 - 當然! - 在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; 
0

嘗試這樣,

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; 
+0

如果您複製其他人的工作,您至少應該提及一些學分... – Shnugo

+1

@Shnugo:感謝您提供樣本數據。 – StackUser

0

enter image description here循環中添加使用的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 @[email protected]+1 
update Table1 set [email protected] where [PID][email protected] 
FETCH NEXT FROM c1 INTO @PID END 
CLOSE c1 
DEALLOCATE c1 

select * from Table1 
+0

請通讀對這個問題的其他答案和評論!你正在積累所有不良習慣和錯誤,你可以這樣做......你依賴於一個不存在的給定排序順序,並且通過使用CURSOR/WHILE循環來顯示基於過程/行的思考。 – Shnugo