2011-06-02 9 views
4

は、次の操作を行うためにそこの方法です:インクリメントINSERT文で変数

INCR()は、変数をインクリメントし、いくつかの機能である
DECLARE @startVal integer 

SELECT 
    @startIdx = MAX(Range_val) 
FROM 
    [Bookings].[dbo].[Range] (nolock) 

INSERT INTO 
    [Bookings].[dbo].[Range] 
VALUES 
    (INCR(@startVal), 'someVal', 'someOtherVal'), 
    (INCR(@startVal), 'someVal1', 'someOtherVal3'), 
    (INCR(@startVal), 'someVal2', 'someOtherVal4'), 

。 '@startIdx + 1'、 '@startIdx + 2'などの代わりに?

EDIT:必ずしもテーブルインデックスである必要はありません。私はテーブルを落として適切な方法で再作成できることを知っています(これがインデックスであると仮定します)。それは私の質問ではありません。説明した方法で変数をインクリメントする方法はありますか?

+1

あなたの「Range_id」に[identity](http://msdn.microsoft.com/en-us/library/ms186775.aspx)を使用していない理由は何ですか? –

+1

あなたは本当にちょうどオートインクリメントのアイデンティティがほしいと思うのですか? – tofutim

+0

DBを設計した人はDBだったからです。 – PhilBrown

答えて

2

で一時テーブルを使用します。 ;

declare @T TABLE (idx int identity(1, 1), f1 varchar(128), f2 varchar(128)) 
    insert into @T values 
     ('someVal', 'someOtherVal'), 
     ('someVal1', 'someOtherVal3'), 
     ('someVal2', 'someOtherVal4') 
    insert [Bookings].[dbo].[Range] 
     select @startIdx + idx, f1, f2 from @T 

それとも

insert [Bookings].[dbo].[Range] 
     select @startIdx + row_number() over(order by name1) as n, * 
      from (
        select top 0  '' as name1, '' as name2 --header 
        union all select 'someVal', 'someOtherVal' 
        union all select 'someVal1', 'someOtherVal3' 
        union all select 'someVal2', 'someOtherVal4' 
     ) T 

はあなたが nolockをしてもよろしいです(IDが第一 フィールドに基づいてアルファベットない序順に割り当てられていますか)?

+0

ここでrow_number()トリックが大好きです。 +1 – Tr1stan

0
/* 
Option 1 
*/ 
INSERT into Range 
     (
       range_id 
     ) 
SELECT MAX(range_id) + 1 
FROM Range 

/* 
Option 2: 
create custom function 
Option 3 (best choice): 
use IDENTITY 
*/ 
-1

アイデンティティを使用するようにその列を設定します。他のすべてのソリューションは、エラーが発生しやすく、メンテナンスが難しくなります.WTFの膨大な負荷のほかに、確かにメンテナンスが難しくなります。あなたが欠陥のあるデザインを永続させることを主張するなら、虫の答えに行く。

1

前述のように、Identity on Rangeテーブルを使用するのが最適です。あなたが見ているだけならば

そうでなければ、私はここ ID列を使用し+1を指定しないようにいくつかの方法があることはできません&と周りの混乱やすくするために、ID列

DECLARE @inc_table TABLE (id INT IDENTITY(1,1), col1 VARCHAR(50), col2 VARCHAR(50)); 

INSERT INTO 
    @inc_table 
VALUES 
    ('someVal', 'someOtherVal'), 
    ('someVal1', 'someOtherVal3'), 
    ('someVal2', 'someOtherVal4'), 

INSERT INTO 
    [Bookings].[dbo].[Range] 
SELECT 
    i.id + m.max_range_id as range_id 
    ,i.col1 
    ,i.col2 
FROM @inc_table i 
INNER JOIN (
    SELECT 
     MAX(Range_id) as max_range_id 
    FROM 
     [Bookings].[dbo].[Range] (nolock) 
) m 
    ON 1=1 
関連する問題