Peut-on faire du SQL dynamic dans From Clause dans une requête Select?

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 …

  • noms de tables
  • join des expressions
  • noms de colonne
  • où les clauses
  • ordre par clause

En fait, vous pourriez dire que vous êtes plus ou less limité à l'utilisation de parameters pour …

  • Valeurs littérales dans les comparaisons MyColumn = @Param1
  • Valeurs littérales dans les instructions select SELECT @Param2
  • Valeurs littérales dans les instructions insert / update SET Column = @Param3
  • Les clauses top, limit et fetch 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.