增加INSERT语句中的变量

时间:2011-06-02 16:40:59

标签: sql-server

有没有办法执行以下操作:

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'等?

编辑:这不一定是表索引。我知道我可以删除表并以正确的方式重新创建它(假设这是索引),但这不是我的问题。有没有办法按照我描述的方式增加变量?

4 个答案:

答案 0 :(得分: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

或(根据第1个,按字母顺序不按顺序分配ID 场)

   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吗?

答案 1 :(得分:1)

正如cetver所提到的,使用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

答案 2 :(得分: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
*/

答案 3 :(得分:-2)

将该列设置为使用标识。除了它将获得的大量WTF之外,其他所有解决方案都更容易出错并且肯定难以维护。如果你坚持让错误的设计永久存在,那就去找cetver的答案吧。