2011-06-02 204 views
4

增加一個變量是有辦法做到以下幾點:在INSERT語句

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'), 

凡INCR()是一些功能增加變量。而不是做'@startIdx + 1','@startIdx + 2'等?

編輯:這不一定是表索引。我知道我可以放下桌子並以適當的方式重新創建它(假設這是索引),但那不是我的問題。有沒有辦法按照我所描述的方式增加一個變量?

+1

爲什麼你沒有爲你的'Range_id'使用[identity](http://msdn.microsoft.com/en-us/library/ms186775.aspx)? – 2011-06-02 16:43:21

+1

看起來你真的只是想要一個自動增量身份不? – tofutim 2011-06-02 16:46:31

+0

因爲設計DB的人是DB。 – PhilBrown 2011-06-02 16:47:38

回答

2

如果你只是希望使其更容易勾搭&不能使用 身份列在這裏有一對夫婦的方式來避免指定+1 ;

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 

或(IDS是按字母順序不分配順序基於第一 場)

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

+0

喜歡這裏的row_number()技巧。 +1 – Tr1stan 2014-08-01 13:14:37

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。如果你堅持讓錯誤的設計延續下去,那就去找Cetver的答案吧。

1

如上所述,使用Identity on Range表將是最佳選擇。

否則,我將使用臨時表與標識列

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