【发布时间】:2017-08-14 01:37:54
【问题描述】:
我有一段 SQL,它接受一个参数,评估参数的内容,并根据内容将不同的 UDF 应用于输入参数。
代码如下:
declare @order varchar(50) = 's12345..s12347'
if isnull( CHARINDEX('.',@order),0) >0
begin
select n as order_no into #temp
FROM F_GetAllNBetween(@order)
end
else if ( isnull( CHARINDEX(',',@order),0) >0 )
begin
select [value] as order_no into #temp2
FROM dbo.F_SplitList(@order,',')
end
if OBJECT_ID('tempdb..#temp') is not null
select * from #temp where order_no <>''
if OBJECT_ID('tempdb..#temp2') is not null
select * from #temp2 where order_no <>''
我想要做的是,将上述联合的输出放到另一个临时表中,并在其余代码的 where 子句中使用它。
我不能使用联合,因为它错误地说需要选择。
我无法使用 cte,因为我无法使用检查来查看临时表是否为空
我不能忽略检查空临时表,否则会出错,说对象不存在(if 语句只创建两个临时表之一)
我无法弄清楚如何将输出发送到不同的临时表。请问有什么想法建议或更好的方法吗?
【问题讨论】:
-
输入参数只会有一个“.” (句号)或其中的“,”(逗号)
-
如果我理解正确的话,我认为你可以通过删除临时表来简化整个事情。例如,
select order_no from (select n as order_no from f_getallnbetween(@order) where charindex('.', @order) > 0 union all select [value] from dbo.f_splitlist(@order, ',') where charindex(',' @order) > 0) as t where order_no <> ''; -
@ZLK 多哈!我怎么没想到!只是展示了专注于使一段代码工作是多么容易。写这个作为答案,我可以接受。谢谢!
标签: sql-server user-defined-functions sql-server-2016 temp-tables union-all