Временные таблицы объединения SQL Server

У меня есть кусок 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, так как не могу использовать проверку, чтобы увидеть, пусты ли временные таблицы.

Я не могу игнорировать проверку пустых временных таблиц, иначе он выдает ошибку, говорящую, что объект не существует (если оператор создает только одну из двух временных таблиц)

Я не могу понять, как получить вывод в другую временную таблицу. Любые идеи, предложения или лучший способ сделать то же самое, пожалуйста?


person Harry    schedule 14.08.2017    source источник
comment
входной параметр будет иметь только . (точка) или , (запятая) в нем   -  person Harry    schedule 14.08.2017
comment
Я думаю, вы могли бы упростить все это, удалив временные таблицы, если я правильно понимаю. Например, 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 <> '';   -  person ZLK    schedule 14.08.2017
comment
@ЗЛК Дох! почему я не подумал об этом! Просто показывает, как легко зациклиться на том, чтобы часть кода работала. Напишите это как ответ, и я мог бы принять это. Спасибо!   -  person Harry    schedule 14.08.2017


Ответы (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 <> '';
person ZLK    schedule 14.08.2017
comment
спасибо за ответ .. но из любопытства .. если вы хотите сделать то, что я изначально хотел сделать .. как я могу это сделать, пожалуйста? - person Harry; 14.08.2017
comment
@ Гарри, я бы создал временную таблицу (или использовал табличную переменную) и вставил в нее из #temp1 (если она существует) и #temp2 (если она существует). например DECLARE @T TABLE (order_no varchar(255)); IF OBJECT_ID(...) IS NOT NULL INSERT @T SELECT order_no и т. д. - person ZLK; 14.08.2017