Выполнение табличной функции из хранимой процедуры с несколькими пропущенными табличными параметрами? - PullRequest
4 голосов
/ 27 сентября 2010

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

Msg 137, Level 16, State 1, Procedure Search, Line 98
Must declare the scalar variable "@myTVP".

Простой пример используемого кода SQL:

CREATE TYPE [dbo].textTable_type AS TABLE(
[text] [nvarchar] (36)
)

CREATE FUNCTION dbo.Search_fn
(@myTVP AS textTable_type READONLY)
RETURNS TABLE
AS
RETURN
(   SELECT * from @myTVP    )
GO

CREATE PROCEDURE [dbo].[Search]
@myTVP AS textTable_type READONLY
AS
BEGIN

SELECT * FROM dbo.Search_fn(@myTVP)

END
GO

DECLARE @TVP as textTable_type
INSERT INTO @TVP VALUES ('abc')
INSERT INTO @TVP VALUES ('123')
exec dbo.Search(@myTVP = @TVP)
GO

DROP FUNCTION Search_fn
DROP PROCEDURE Search

Если бы кто-нибудь мог дать какое-то понимание, это было бы замечательно!

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

Спасибо.

1 Ответ

1 голос
/ 27 сентября 2010

Это работает для меня. (Добавлены некоторые Go разделители пакетов и удалены скобки из вызова хранимой процедуры)

Если это не работает для вас, каков уровень совместимости вашей базы данных?

CREATE TYPE [dbo].textTable_type AS TABLE(
[text] [nvarchar] (36)
)
GO

CREATE FUNCTION dbo.Search_fn
(@myTVP AS textTable_type READONLY)
RETURNS TABLE
AS
RETURN
(   SELECT * from @myTVP    )
GO


CREATE PROCEDURE [dbo].[Search]
@myTVP AS textTable_type READONLY
AS
BEGIN

SELECT * FROM dbo.Search_fn(@myTVP)

END
GO

DECLARE @TVP as textTable_type
INSERT INTO @TVP VALUES ('abc')
INSERT INTO @TVP VALUES ('123')
exec dbo.Search @myTVP = @TVP 

GO

DROP FUNCTION [dbo].Search_fn
DROP PROCEDURE [dbo].Search
DROP TYPE [dbo].textTable_type
...