【问题标题】:SQL Server union temp tablesSQL Server 联合临时表
【发布时间】: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) &gt; 0 union all select [value] from dbo.f_splitlist(@order, ',') where charindex(',' @order) &gt; 0) as t where order_no &lt;&gt; '';
  • @ZLK 多哈!我怎么没想到!只是展示了专注于使一段代码工作是多么容易。写这个作为答案,我可以接受。谢谢!

标签: sql-server user-defined-functions sql-server-2016 temp-tables union-all


【解决方案1】:

正如我在评论中提到的,您可以简化当前代码以使用 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,我将创建一个临时表(或使用表变量)并从#temp1(如果存在)和#temp2(如果存在)插入其中。例如DECLARE @T TABLE (order_no varchar(255)); IF OBJECT_ID(...) IS NOT NULL INSERT @T SELECT order_no
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2011-02-14
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2011-04-10
相关资源
最近更新 更多