2017-08-04 3 views
1

J'ai une fonction Table value, avec certains des paramètres nullable et d'autres définissant certains des noms de table et de colonne que la fonction utilisera. Cela signifie malheureusement un besoin de SQL dynamique. La requête a parfaitement fonctionné quand j'utilisé dans des SSMS, mais en essayant de le transformer en un résultat de fonction dansInsertion dans la table Valeur de retour de table à l'aide de SQL dynamique

Msg 443, niveau 16, état 14, Événements Procédure, ligne 67 [Lot ligne de départ 0] Utilisation invalide d'un opérateur à effets latéraux 'INSERT EXEC' dans une fonction.

La fonction est censée prendre le nom d'un événement, qui constituera la source de données de l'événement, et les colonnes clés des tables d'événements, "e.'[email protected]+'ID" et 'e.'[email protected]+'Number'

La fonction aura un rapport généré basé sur le retour, et être joint à dans une autre procédure pour générer un autre rapport. J'ai regardé autour mais la plupart des exemples et questions similaires ne s'appliquent pas du tout, cherchant généralement à modifier une table dans la base de données, pas une variable de table, ou ne cherchant pas à insérer dans la variable de table de retour. Est-il possible de contourner la restriction, soit avec des tables temporaires, soit avec l'insertion dans le SQL dynamique?

IF (@childEvent IS NOT NULL) BEGIN 
    SET @SQL = ' SELECT e.ProductID, e.ProductName, e.'[email protected]+'Number, e.Quantity - ISNULL(c.Quantity,0) AS Quantity ' 
     +' FROM {schema}.'[email protected]+'Table e ' 
     +' LEFT OUTER JOIN {schema}.'[email protected]+'Table c ' 
     +' ON c.'[email protected]+'ID = e.'[email protected]+'ID ' 
END 
INSERT INTO @Events 
EXECUTE sp_executesql @SQL, N'@asOfDate Date',@asOfDate 
+2

Utilisez une procédure stockée ou une fonction table CLR. Vous ne pouvez pas exécuter SQL dynamique dans une fonction table. –

Répondre

0

Vous ne pouvez pas utiliser SQL dynamique dans une fonction de valeur table.