0

行番号を挿入するためだけにrow_numberまたはrankを使用しようとしているので、カーソルを使用せずに一時テーブルを列挙できます。どちらの関数でも、「'rank'の近くの構文が正しくありません。'OVER'が必要です」というエラーが表示されます。OVERが提供するすべての機能とパフォーマンスへの影響は必要ありません-順序やランク付けなどについては少し気にしません。これは以前に行ったことがあると思いますが、数年前のことです。誰かが私を指摘できますか正しい機能に?

declare @SomeTempTable table (RowNum int NOT NULL, SomeField int NOT NULL);

insert into @SomeTempTable
  select rank() as RowNum, SomeField
  from SomeTable 

declare @RowNum int = 1;
declare @NumRows int = (select max(RowNum) from @SomeTempTable);

while@RowNum <= @NumRows
begin
  declare @SomeField int;

  select @SomeField = SomeField
  from @SomeTempTable
  where RowNum = @RowNum;

  --TODO: Do stuff  

  set @RowNum = @RowNum + 1;               
END
4

1 に答える 1

0

うーん、たとえそれがあなたにとって魅力的であったとしても、あなたはSQL関数の構文を決めることができません。

欲しいものを手に入れるには2つの方法があります。1つ目は、Windows関数をまったく使用しない標準的な方法です。

declare @SomeTempTable table (
    RowNum int identity(1,1) not null,
    SomeField int NOT NULL
);

insert into @SomeTempTable(SomeField)
     select SomeField
     from SomeTable 

出来上がり!アイデンティティに仕事を任せましょう。

2番目はあなたが取っていたアプローチです:

insert into @SomeTempTable(RowNum, SomeField)
    select row_number() over (order by (select NULL)) as RowNum, SomeField
    from SomeTable 

「orderby(Select NULL)」は、実際には並べ替えを行わずに、番号を割り当てるだけのSQLServerの魔法の呪文のようです。

余談ですが、挿入を行うときは、常に挿入ステートメントで列を指定する必要があります。

また、WHILEループをクエリとして書き直して、すべてをより効率的にすることも可能です(常にではありませんが、場合によっては)。

于 2012-05-30T02:43:05.873 に答える