有没有办法执行以下操作:
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'等?
编辑:这不一定是表索引。我知道我可以删除表并以正确的方式重新创建它(假设这是索引),但这不是我的问题。有没有办法按照我描述的方式增加变量?
答案 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的答案吧。