La requête select dans une clause from peut-elle être un SQL dynamic? Par exemple
DECLARE @sql NVARCHAR(MAX) SET @sql='SELECT * table' SELECT t.*, a+b AS total_sum FROM ( EXEC (@sql) ) t
Si ce qui précède n'est pas possible, comment pouvons-nous réaliser cette fonctionnalité? Bien sûr, la requête ci-dessus entraîne une erreur lors de l'exécution dans le server SQL.
Merci pour l'aide.
Pour utiliser la clause from table dynamic, vous devez exécuter la command EXEC(@sql)
extérieur: Dans votre exemple ci-dessus:
DECLARE @sql NVARCHAR(MAX) DECLARE @dynamicSql NVARCHAR(MAX) SET @sql='SELECT * table' SET @dynamicSql ='SELECT t.*, a+b AS total_sum FROM ( '+@sql+' ) t' EXECUTE sp_executesql @dynamicSql
Dans SQL Server, une instruction SQL est compilée la première fois que la database la voit. Cela signifie que tout ce qui peut modifier le code généré ne peut pas être un paramètre. Ce qui signifie que vous ne pouvez pas utiliser les parameters pour …
En fait, vous pourriez dire que vous êtes plus ou less limité à l'utilisation de parameters pour …
MyColumn = @Param1
SELECT @Param2
SET Column = @Param3
SELECT TOP @Param4
Comme mentionné ailleurs, la sp_executesql
consiste à créer votre SQL en tant que string, puis passez cette string à sp_executesql
.
Notes profondes:
SQL est normalement compilé dans un langage intermédiaire. Ce langage intermédiaire peut être vu comme XML. Voir "plans d'exécution" pour plus d'informations.
Dans SQL Server 2014, les procédures stockées peuvent être converties en code C ++, puis compilées en langage machine. Il y a beaucoup de ressortingctions quand on fait cela qui sont trop discus ici.