3

J'ai une procédure stockée qui exécute du code répétitif, j'ai donc décidé de transformer le code redondant en une fonction table. Le problème que je rencontre est:Exécution d'une fonction de table à partir d'une procédure stockée avec plusieurs paramètres évalués par table en cours de transmission?

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

Un exemple simple du code SQL que j'utilise est:

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 

Si quelqu'un peut fournir une idée, ce serait merveilleux!

(Il y a quelques erreurs supplémentaires si vous essayez d'exécuter cet exemple, mais ils proviennent de l'erreur inclus. Le problème est que la recherche de procédure stockée ne peut pas être créé.

Merci.

Répondre

1

cela fonctionne pour moi. (Ajout de quelques Go délimiteurs par lots et les supports retirés de l'appel de procédure stockée)

Si cela ne fonctionne pas pour vous quel est le niveau de compatibilité de votre base de données?

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 
+0

Je suppose que parce que mon niveau de compatibilité est 80, ça ne va pas fonctionner. – Brett