SQL Server联合临时表
问题描述:
我有一块SQL接受参数,评估参数的内容并根据内容对输入参数应用不同的UDF。SQL Server联合临时表
的代码是这样的:
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语句只创建的一个两个临时表)
我无法弄清楚如何获得输出到不同的临时表。任何想法建议或更好的方式做同样的请吗?
答
正如我的评论中所提到的,您可以简化当前的代码,以便用UNION和WHERE子句来取代IF语句。例如
SELECT order_no
--INTO #someTempTable -- if needed
FROM (
SELECT order_no = n
FROM dbo.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 <> '';
输入参数将只有一个“。”。 (句号)或者一个“,”(逗号) – Harry
我想你可以通过删除临时表来简化整个事情,如果我正确理解它的话。例如,'select order_no from(from 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
@ZLK Doh!为什么我没有想到这一点!只是要说明让代码工作是多么容易。写这个答案,我可以接受它。谢谢! – Harry