4 Stimmen

Ausführen einer tabellenwertigen Funktion aus einer gespeicherten Prozedur mit mehreren durchlaufenden tabellenwertigen Parametern?

Ich habe eine gespeicherte Prozedur, die einige sich wiederholende Code ausführt, so dass ich beschlossen, den redundanten Code in eine Tabelle-bewertete Funktion zu machen. Das Problem, auf das ich stoße, ist:

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

Ein einfaches Beispiel für den SQL-Code, den ich verwende, lautet:

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

Wenn jemand einen Einblick geben kann, wäre das wunderbar!

(Es gibt ein paar zusätzliche Fehler, wenn Sie versuchen, dieses Beispiel auszuführen, aber sie stammen von dem enthaltenen Fehler. Das Problem liegt darin, dass die gespeicherte Prozedur Search nicht erstellt werden kann.

Gracias.

1voto

Martin Smith Punkte 417623

Das funktioniert bei mir. (Einige hinzugefügt Go Stapelbegrenzer und entfernte Klammern aus dem Aufruf der gespeicherten Prozedur)

Wenn dies bei Ihnen nicht funktioniert, wie hoch ist die Kompatibilitätsstufe Ihrer Datenbank?

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X