Pardonnez-moi, je suis un développeur qui est passé au monde de SQL. Je pensais que je pouvais améliorer certains SQL en ajoutant des variables mais cela ne fonctionnait pas comme je m'y attendais. Quelqu'un peut-il me dire pourquoi cela ne fonctionne pas? Je ne veux pas de travail, je veux connaître les raisons pour lesquelles cela ne fonctionne pas comme je l'imagine, car je suis sûr qu'il y a une bonne raison, mais actuellement, cela ne me saute pas aux yeux.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
gareth
la source
la source
USE
commande avec un paramètre.GO
, la variable précédemment déclarée disparaît. Vous souhaiterez peut-être examiner les variables SQLCMD, qui peuvent ou non s'appliquer à votre scénario.Réponses:
Par la page en ligne de livres pour les variables
Cela fonctionnerait comme vous l'attendiez si, par exemple, vous utilisiez votre variable dans une clause where. Quant à savoir pourquoi, je pense que cela a quelque chose à voir avec l'analyseur incapable d'évaluer la variable et donc de vérifier son existence. Lors de l'exécution, la requête est d'abord analysée pour la syntaxe et les objets, puis, si l'analyse réussit, la requête s'exécute à quel point la variable serait définie.
la source
eval
fonctions dans des langages procéduraux comme JavaScript et Python. C'est un moyen rapide de créer des failles de sécurité.Les limitations de l'utilisation des variables dans les instructions SQL proviennent de l'architecture de SQL.
Le traitement d'une instruction SQL se déroule en trois phases:
Le serveur SQL cache l'étape de préparation au programmeur et l'exécute beaucoup plus rapidement que les bases de données plus traditionnelles telles qu'Oracle et DB2. C'est pour des raisons de performances que SQL passe potentiellement beaucoup de temps à déterminer un plan d'exécution optimal, mais uniquement la première fois que l'instruction est rencontrée après un redémarrage.
Ainsi, en SQL statique , les variables ne peuvent être utilisées que dans des endroits où elles n'invalideront pas le plan d'exécution, donc pas pour les noms de table, les noms de colonne (y compris les noms de colonne dans les conditions WHERE), etc.
Le SQL dynamique existe pour les cas où l'on ne peut pas contourner les restrictions, et le programmeur sait que son exécution prendra un peu plus de temps. Le SQL dynamique peut être vulnérable à l'injection de code malveillant, alors faites attention!
la source
Comme vous pouvez le voir, la question du «pourquoi» nécessite un type de réponse différent, y compris une justification historique et des hypothèses sous-jacentes à la langue, je ne suis pas sûr de pouvoir vraiment rendre justice.
Cet article complet par SQL MVP Erland Sommarskog tente de fournir une justification, ainsi que la mécanique:
La malédiction et les bénédictions du SQL dynamique :
Ceci (et la sécurité, voir ci-dessous) est probablement la principale raison.
SQL fonctionne en partant du principe que les requêtes ne sont pas des opérations ponctuelles, mais qu'elles seront utilisées à plusieurs reprises. Si la table (ou la base de données!) N'est pas réellement spécifiée dans la requête, elle n'a aucun moyen de générer et d'enregistrer un plan d'exécution pour une utilisation future.
Oui, toutes les requêtes que nous exécutons ne seront pas réutilisées, mais c'est la prémisse d'exploitation par défaut de SQL , donc les "exceptions" sont censées être exceptionnelles.
Erland énumère quelques autres raisons (notez qu'il énumère explicitement les avantages de l'utilisation des procédures stockées , mais beaucoup d'entre elles sont également des avantages des requêtes paramétrées (non dynamiques)):
Encore une fois, chacun d'eux a cent nuances que je n'entrerai pas ici.
la source
Vous devez utiliser SQL dynamique
ci-dessous est la sortie de l'impression .. une fois que vous ne commentez pas
exec sp_executesql @sqltext
les instructions seront effectivement exécutées ...la source