2016-03-28 5 views
0

Я работаю над запросом и создал функцию для извлечения результата из таблицы outcomes, содержащей следующий код.Объявить переменную таблицы в UDF, чтобы ввести имя таблицы в качестве параметра

CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) 
RETURNS TABLE 
AS 
    RETURN 
     SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' 
      + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) 
      + ' ' 
      + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work 
     FROM outcomes 
     WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 

Проблема приведенного выше кода является то, что это не имеет значения, какой параметр я вошел во время выполнения, он всегда дает результат, пока в качестве параметра я введено правильное имя таблицы в базе данных.

Сейчас я задаюсь вопросом, могу ли я создать параметр для ввода имени таблицы в FROM, так, только когда я введу outcomes, он отобразил бы результат.

Я попытался объявить переменную таблицы, используя следующий код:

declare @ship_outcome table 
( final_work nvarchar(30) 
) 

insert into @ship_outcome (final_work) 
select 
     left(ship, charindex(' ', ship) - 1) + ' ' + 
     replicate('*', charindex(' ', substring(ship, charindex(' ', ship) + 1, len(ship))) + 1 -2) + ' ' + 
     reverse(left(reverse(ship), charindex(' ', reverse(ship)) - 1)) 
from outcomes 
where charindex(' ', substring(ship, charindex(' ', ship) + 1, len(ship))) > 1; 

select * from @ship_outcome 

Однако я не уверен, как консолидировать табличную переменную в ОДС. Пожалуйста помоги.

+0

Непонятно. Вы хотите получить результат, только когда '@tbl = results'? –

+1

добавить в предложение WHERE 'AND @tbl = 'results'' – Squirrel

+0

В этом случае я предлагаю вам не вызывать эту функцию самостоятельно –

ответ

1

Вы также можете достичь результата с помощью IF оператора в многооконном операторе таблица значной функции, как указано ниже: -

CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) 
RETURNS @t table 
(final_work nvarchar(30)) 
AS 
begin 
if @tbl = 'outcomes' 
begin 
     Insert into @t 
     SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' 
      + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) 
      + ' ' 
      + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work 
     FROM outcomes 
     WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 
end 
return 
end 

Примечание - Выполнение функции мульти табличного значения утверждения ужасно для больших записей. Целесообразно использовать функцию Inline, используя @tbl = 'исходы' в том месте, где выражение в функции встроенного значения таблицы, например -

CREATE FUNCTION dbo.Shippad (@tbl NVARCHAR(30)) 
RETURNS TABLE 
AS 
    RETURN 
     SELECT LEFT(ship, Charindex(' ', ship) - 1) + ' ' 
      + Replicate('*', Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) + 1 -2) 
      + ' ' 
      + Reverse(LEFT(Reverse(ship), Charindex(' ', Reverse(ship)) - 1)) as final_work 
     FROM outcomes 
     WHERE Charindex(' ', Substring(ship, Charindex(' ', ship) + 1, Len(ship))) > 1 and @tbl = 'outcomes' 
+0

спасибо за решение. как вы упомянули о добавлении условия в оператор 'WHERE', просто я это сделаю, добавив' AND @tbl = 'results''? – malamoji

+0

Я добавил условие @tbl = 'исходы' в предложении where функции встроенного значения таблицы. Пожалуйста, см. Мой обновленный ответ – sam

+0

привет спасибо за обновления. еще одна вещь, которую я только заметил, - это то, что я думаю, что инструкция 'insert' после' begin' необходима – malamoji

 Смежные вопросы

  • Нет связанных вопросов^_^