0

ID を使用せずに、空の列を 1 から始まる昇順の数字で埋める方法はありますか?

次のカーソルを試しましたが、列のすべての行に同じ値 (450) が入力されています。

declare cur3 cursor for
select new_id from sheet1$
declare @no int
declare @no1 int
set @no1 = 1
open cur3
fetch next from cur3 into @no
while(@@FETCH_STATUS = 0)
begin
update sheet1$ set new_id = @no1
set @no1 = @no1 + 1
fetch next from cur3 into @no
end
close cur3
deallocate cur3
4

2 に答える 2

3

WHERE問題は、更新クエリから句が欠落しているため、各ループがすべての行を更新していることです。そのはず:

UPDATE  sheet1$ 
SET     new_id = @no1
WHERE   New_ID = @No    -- ONLY UPDATE 1 ROW

余談ですが、SQL-Serverタグが正しいと仮定すると、ROW_NUMBER()関数を使用してカーソルなしでこれを行うことができます

WITH CTE AS
(   SELECT  New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID)
    FROM    yourTable
)
UPDATE  CTE
SET     New_ID = RN

編集 - 説明

ROW_NUMBER は一連の数字を提供するだけで、Common Table Expressionは動的ビューのようなものです。

If you run:

WITH CTE AS
(   SELECT  New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID)
    FROM    yourTable
)
SELECT  *
FROM    CTE

CTE内で何が行われているのかをよりよく理解する必要があります。CTEの利点は、元のテーブルを参照しなくても直接更新できることです。したがって、CTEの更新は次のようになります。

UPDATE  yourTable
SET     New_ID = RN
FROM    yourTable
        INNER JOIN
        (   SELECT  New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID)
            FROM    yourTable
        ) n
            ON n.New_ID = yourTable.New_ID;
于 2012-11-06T17:50:35.483 に答える
1

うん、ROW_NUMBER

次のように使用します。

select ROW_NUMBER()OVER(ORDER BY Somefield) As Id
      ,*
  from SomeTable

あなたはそれについてすべて読むことができます:http://msdn.microsoft.com/en-us/library/ms186734(v=sql.105).aspx

于 2012-11-06T17:49:05.123 に答える