在INSERT语句
问题描述:
增加一个变量是有办法做到以下几点:在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
;
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
答
/*
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
*/
答
将该列设置为使用标识。其他解决方案更容易出错,而且一定会更难以维护,除此之外,它将获得大量的WTF。如果你坚持让错误的设计延续下去,那就去找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
为什么你没有为你的'Range_id'使用[identity](http://msdn.microsoft.com/en-us/library/ms186775.aspx)? – 2011-06-02 16:43:21
看起来你真的只是想要一个自动增量身份不? – tofutim 2011-06-02 16:46:31
因为设计DB的人是DB。 – PhilBrown 2011-06-02 16:47:38