如何在CASE语句MSSQL中实现使用序列

时间:2017-03-22 09:18:22

标签: sql-server case sequence restrictions

在我的sql查询中,我想在CASE语句中使用序列。 问题是,我不能在CASE中使用NEXT VALUE FOR。 我试图定义用户函数,但是在UDF中使用exec和修改数据的限制使我的解决方案无用......

这是我的测试代码:

    create sequence temp_test start with 1
select 
'value1',
'value2',
case when(1=1)
then next value for temp_test
else (select current_value from sys.sequences where name='temp_test')
end
drop sequence temp_test

如果条件为真,我需要的是增加变量并返回它。有什么想法吗?

确切的错误是

  
    

NEXT VALUE FOR函数不能在CASE,CHOOSE,COALESCE,IIF,ISNULL和NULLIF中使用。

  

2 个答案:

答案 0 :(得分:0)

也许你的意思是这样的:

declare @value INT

SELECT @value = CAST(current_value AS INT) 
FROM sys.sequences WHERE name = 'temp_test';

IF (1=1)
    select  @value = next value for temp_test;


select 
'value1',
'value2',
@value

目前尚不清楚为什么你需要将它全部放在一个选择中但在我看来违反了一些规则,你的选择可能会或可能不会在运行时对数据库产生影响。

您或许可以使用identity来做您想做的事情,或者您可以用不同的方式写出来,但您不会解释您真正想要做的事情(即将新密钥加载到表中?)所以我无法进一步帮助

答案 1 :(得分:0)

首先直接创建一个临时表,然后将id设置为null(需要设置序列),而不是直接将其插入目标表。 之后,更新其ID行为null的临时表。 之后,从临时表插入目标表。

Select case when @something = 1 then cast(null as int)
       else ID ends id,
       value
into #temp
from temp_test;

update #temp
set id = next value for [your_seq]
where id is null;