2009-04-22 11 views
0

Je transmets le nom View en tant que paramètre dans une fonction Table Valued, et je souhaite extraire des données de cette vue en créant un SQL dynamique et en l'exécutant avec sp_executesql(). lorsque j'essaie d'exécuter la fonction, j'obtiens l'erreur: Seules les fonctions et les procédures stockées étendues peuvent être exécutées à partir d'une fonction.Nom de la vue dynamique dans la fonction Valeur table

SGBD: SQL Server 2005

solutions de contournement?

set @SQLString = 
     N'select @Desc = Description from ' 
    + @TableName 
    + ' where Code = @Code;' 

execute sp_executesql @SQLString, 
    N'@Code nvarchar(500), 
     @Desc nvarchar(500) OUTPUT', 
     @Code = @Code, 
     @[email protected] OUTPUT; 

Répondre

1

Eh bien, vous pouvez encapsuler le SQL dynamique dans une procédure stockée étendue. Cela fonctionnerait, mais je conseillerais (fortement) de ne pas le faire.

SQL Server exige que les fonctions définies par l'utilisateur soient déterministes (à l'exception des procédures stockées étendues susmentionnées), c'est-à-dire que les résultats de la fonction doivent être uniformément prévisibles à partir des paramètres d'entrée. Étant donné que les procédures stockées peuvent accéder aux données de n'importe où, utiliser des nombres aléatoires, etc., SQL Server ne vous autorisera pas à les utiliser dans une fonction.

Il existe d'autres approches que vous pouvez utiliser, telles que la préconfiguration d'une variable de table avec vos données, la modification de votre schéma, etc., en fonction de vos besoins de performances et de la configuration du schéma.

0

pas à moins que vous voulez faire une requête de réalimentation en appelant un proc étendu comme xp_cmdshell

quelque chose comme ça, modifier pour répondre à vos besoins

CREATE FUNCTION fnBla(@id int) 
RETURNS int 
AS 
BEGIN 
DECLARE @SQL varchar(500) 
SELECT @SQL='osql -S' [email protected]@servername +' -E -q "exec tempdb..prLog ''fnBla''"' 
EXEC master..xp_cmdshell @SQL 
RETURN @id 
END 

Juste pour que vous savez que je ne ferais pas ce de cette façon puisque vous créez une requête de bouclage et n'exécutez pas le code le plus sûr raison pour laquelle vous ne pouvez pas utiliser un proc à la place d'une fonction?

+0

Je ne voulais pas vous faire de la publicité à la baisse. (Je ne me souviens même pas d'avoir fait ça, ça a dû être un clic raté.) C'est maintenant enfermé. Désolé pour ça. – RMD

Questions connexes