1 : Les instructions SQL ordinaires peuvent être exécutées avec exec
Sélectionner * depuis tableName exec('select * depuis tableName') exec sp_executesql N’select * from tableName' -- Notez que vous devez ajouter N avant la chaîne
2 : Lors de l’utilisation de noms de champs, de tables, de bases de données, etc. comme variables, il faut utiliser du SQL dynamique
déclarez @fname Varchar(20) set @fname = 'FiledName' Sélectionnez @fname depuis tableName -- Erreur, aucune erreur n’est demandée, mais le résultat est une valeur fixe FiledName, ce qui n’est pas ce que vous voulez. exec('select ' + @fname + ' from tableName') -- notez qu’un espace est ajouté sur le côté de la guillemetage avant et après le signe plus
Bien sûr, vous pouvez aussi changer la chaîne en une variable déclarez @fname Varchar(20) définir @fname = 'NomEnregistré' --Définir le nom du champ
déclarez @s varchar (1000) définissez @s = 'select ' + @fname + ' from tableName' exécutif(@s) -- succès exécutif sp_executesql @s -- Cette phrase signalera une erreur
déclarez @s Nvarchar(1000) — notez que c’est changé en nvarchar(1000) ici. définissez @s = 'select ' + @fname + ' from tableName' exécutif(@s) -- succès Exécutif sp_executesql @s -- Cette phrase est correcte
3. Paramètres de sortie déclare @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' exécutif(@sqls)
--comment puis-je mettre le résultat de l’exécution exécutive dans une variable ?
déclare @num int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName ' exécutif sp_executesql @sqls,N'@a int output',@num output Sélectionnez @num
1 : Les instructions SQL ordinaires peuvent être exécutées avec Exec Exemple : Sélectionnez * depuis tableName Exec('select * depuis tableName') Exécutif sp_executesql N’select * from tableName' -- Notez que vous devez ajouter N avant la chaîne
2 : Lors de l’utilisation de noms de champs, de tables, de bases de données, etc. comme variables, il faut utiliser du SQL dynamique
Erreur : déclarer @fname Varchar(20) set @fname = 'FiledName' Sélectionnez @fname depuis tableName -- Erreur, aucune erreur n’est demandée, mais le résultat est une valeur fixe FiledName, ce qui n’est pas ce que vous voulez. Correct : Exécutif ('select ' + @fname + ' from tableName') — remarquez l’ajout d’un espace sur le côté de la guillemetage avant et après le signe plus
Bien sûr, vous pouvez aussi changer la chaîne en une variable déclarez @fname Varchar(20) définir @fname = 'NomEnregistré' --Définir le nom du champ
déclarez @s varchar (1000) définissez @s = 'select ' + @fname + ' from tableName' Exécutif(@s) -- Succès exécutif sp_executesql @s -- Cette phrase signalera une erreur
--Note : @s paramètre doit être de type ntext, nchar ou nvarchar, déclarer @s varchar(1000) doit être changé pour déclarer @s nvarchar(1000)
Voici : déclarez @s Nvarchar(1000) — notez que c’est changé en nvarchar(1000) ici.
définir @fname = 'NomEnregistré' --Définir le nom du champ définissez @s = 'select ' + @fname + ' from tableName' Exécutif(@s) -- Succès Exécutif sp_executesql @s -- Cette phrase est correcte
3. Paramètres d’entrée ou de sortie
(1) Paramètres d’entrée : Déclare @QueryString nvarchar(1000) -- variable dynamique de requête (note : doit être de type ntext ou nchar nvarchar, pas de type varchar) Déclarer @paramstring nvarchar(200) - définir la chaîne de paramètres dans l’instruction dynamique (note : doit être de type ntext ou nchar nvarchar, pas type varchar) Déclare @input_id int - définit la valeur des paramètres à passer dans l’instruction dynamique
Définissez @QueryString='Select * depuis Nametable où id=@id' --id est le nom du champ, @id est le paramètre à passer définisse @paramstring='@id int' -- Définit la chaîne qui définit les paramètres dans l’instruction dynamique Définissez @input_id = 1 -- Réglez la valeur du paramètre à passer dans l’instruction dynamique à 1 exécutif sp_executesql @querystring,@paramstring,@id=@input_id S’il existe plusieurs paramètres : Déclare @QueryString nvarchar(1000) -- variable dynamique de requête (note : doit être de type ntext ou nchar nvarchar, pas de type varchar) Déclarer @paramstring nvarchar(200) - définir la chaîne de paramètres dans l’instruction dynamique (note : doit être de type ntext ou nchar nvarchar, pas type varchar) Déclare @input_id int - définit la valeur du paramètre à passer dans l’instruction dynamique, paramètre 1 Déclarez @input_name varchar(20) - définit la valeur de l’argument à passer dans l’énoncé dynamique, paramètre 2
Définissez @QueryString='Select * from Tablename où id=@id et name=@name' --id et name sont des noms de champs, et @id et @name sont les paramètres à passer Définissez @paramstring='@id int,@name varchar(20)' -- Définissez la chaîne de définition des paramètres dans l’instruction dynamique, séparée par « », Définissez @input_id = 1 -- Réglez la valeur du paramètre à passer dans l’instruction dynamique à 1 définissez @input_name='Zhang San' --Définissez la valeur du paramètre à passer dans l’instruction dynamique sur 'Zhang San' exécutif sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Notez l’ordre des arguments (2) Paramètres de sortie déclare @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' exécutif(@sqls) --comment puis-je mettre le résultat de l’exécution exécutive dans une variable ? déclare @QueryString nvarchar(1000) -- variable de nom de requête dynamique (Note : doit être de type ntext ou nchar nvarchar, pas type varchar) Déclarer @paramstring nvarchar(200) - définir la chaîne de paramètres dans l’instruction dynamique (note : doit être de type ntext ou nchar nvarchar, pas type varchar) Déclare @output_result int - Le résultat de la requête est attribué au @output_result
Set @QueryString='Select @totalcount=count(*) from tablename' --@totalcount est le paramètre de sortie Définissez @paramstring='@totalcount int output' --Définissez la chaîne définie par les paramètres dans l’instruction dynamique, séparés par « », exécutif sp_executesql @querystring,@paramstring,@totalcount=@output_result sortie Sélectionnez @output_result Bien sûr, les paramètres d’entrée et de sortie peuvent être utilisés ensemble, donc vous pouvez essayer vous-même. De plus, si vous voulez produire l’ensemble de résultats d’une requête dynamique, je ne pense qu’à la méthode suivante : utiliser des tables temporaires, je ne sais pas si vous avez une meilleure méthode. SI object_id('[tempdb].[ dbo].#tmp') N’EST PAS NUL -- Déterminez si la #tmp de table temporaire existe, et si elle existe, supprimez-la #tmp de la table de déplacement sélectionner * dans #tmp à partir de nom de table où 1=2 -- Créer un #tmp temporaire de table avec la même structure que le nom de table
déclare @QueryString nvarchar(1000) -- variable de nom de requête dynamique (Note : doit être de type ntext ou nchar nvarchar, pas type varchar) Set @QueryString='Select * from Table Name ' insérer dans #tmp(field1,field2,...) exec(@querystirng) |