Объявите переменную таблицы в UDF для ввода имени таблицы в качестве параметра
Я работаю над запросом и создал функцию для получения результата из outcomes
Таблица, содержащая следующий код.
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
Однако я не уверен, как консолидировать переменную таблицы в UDF. Пожалуйста помоги.
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
Примечание. Производительность функции табличного значения для нескольких операторов ужасна для больших записей. Рекомендуется использовать встроенную функцию, используя @tbl = 'resultss' в выражении where в встроенной табличной функции значения, например:
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'