2011-06-02 153 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