2011-07-18 11 views
2

MySQL hereと同じ質問がありましたが、とにかくその構文がSQL Serverでは動作しません。非インクリメントIDを使用してinsertステートメントを実行する方法は?

私は非常によく必要なものを説明しているので、ここではその質問のサンプルを(簡略化して)貼り付けます。

DECLARE @t1 integer 
SET @t1=0; 
-- MyTable is a simple Table with 2 fields "MyID" and "MyValue" 
insert into MyTable 
SELECT @t1 := @t1+1, --this "should" work in MySQL 
    MyAnotherValue 
FROM AnotherTable 

カーソルを使用せずにSQL Serverで同じことを達成する方法はありますか?

注:これは、クエリ1回実行する、それがメンテナンスクエリでされているので、競合状態とロックは問題ではありません。

答えて

2

を使用することによって、これを達成することができます:MyTableが空の場合

insert into MyTable(MyId, MyValue) 
    select (select isnull(max(MyId), 0) from MyTable) + -- avoid duplicated keys, if you repeat this insert again 
     row_number() over(order by MyAnotherValue), 
     MyAnotherValue 
    from AnotherTable 

isnull()機能はケースをカバーしてい

+0

ありがとう、バリーの回答も適切です(私もそこに+1しました)が、私の必要としているものなので、あなたの答えは完璧です。 – LaBracca

3

あなたはそれが複数回実行した場合でも、これは動作しますRow_Number()

Insert Into dbo.AnotherTable (Col1, Col2) 
Select Row_Number() Over(Order By SomeColumn), 
     SomeColumn 

From dbo.YourTable 
関連する問題