Maison > base de données > tutoriel mysql > le corps du texte

Explication détaillée de l'utilisation d'instructions SQL Server non dynamiques pour exécuter des requêtes dynamiques

怪我咯
Libérer: 2017-07-05 11:06:00
original
1903 Les gens l'ont consulté

Cet article vous parle principalement des instructions SQL Server non dynamiques pour exécuter des requêtes dynamiques. En fonctionnement réel, j'ai essayé de transmettre une série de valeurs délimitées par des virgules dans une procédure stockée. limiter le jeu de résultats. Mais chaque fois que j'utilise la variable dans la clause IN, je reçois le message d'erreur

Cet article vous parle principalement de la dynamique d'exécution non dynamique des instructions SQL ServerSQL Requête, en fonctionnement réel, j'ai essayé de transmettre une série de valeurs délimitées par des virgules dans une procédure stockée pour limiter le jeu de résultats. Mais chaque fois que j'utilise une variable dans une clause IN, je reçois un message d'erreur.

Existe-t-il un moyen de terminer la requête sans exécuter une instruction SQL dynamique ?

J'ai essayé de transmettre une série de valeurs délimitées par des virgules dans une procédure stockée pour limiter l'ensemble des résultats. Mais chaque fois que j'utilise une variable dans une clause IN, je reçois un message d'erreur. Existe-t-il un moyen de terminer la requête sans exécuter des instructions SQL ServerSQL dynamiques ?

Réponse de l'expert :

Il existe un moyen de terminer la requête sans exécuter des instructions SQL ServerSQL dynamiques ? . Il existe des moyens de compléter la requête, mais explorons d'abord ce problème. J'utiliserai la base de données AdventureWorks dans les exemples suivants.

Lorsque vous n'avez qu'une seule valeur, l'exécution ne posera aucun problème.

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3' 
Select * from HumanResources.Employee 
Where ManagerID IN (@ManagerIDs)
Copier après la connexion

Mais une fois que vous avez ajouté la virgule, le résultat sera à peu près le suivant :

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3,6' 
Select * from HumanResources.Employee 
Where ManagerID IN (@ManagerIDs) 
Msg 245, Level 16, State 1, Line 4 
Conversion failed when converting the varchar value '3,6' to data type int.
Copier après la connexion

C'est parce que SQL Server reconnaît que la colonne ManagerID est un entier, il le fera donc convertir automatiquement les @ManagerIDs en variable.

Pour résoudre ce problème, vous pouvez utiliser du SQL dynamique pour exécuter cette instruction. De cette façon, vous pouvez créer dynamiquement l’intégralité de la requête avant de l’exécuter.

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3,6' 
Declare @SQL Varchar(1000) 
Set @SQL = 
'Select * from HumanResources.Employee 
Where ManagerID IN (' + @ManagerIDs + ')' 
EXEC (@SQL)
Copier après la connexion

Cela vous permet d'exécuter la requête, mais le SQL dynamique est dangereux et peut même ne pas être utilisé dans certaines organisations.

Alors, comment exécuter une requête sans utiliser de SQL dynamique ? Cela peut être réalisé via XML ?

Dans un premier temps, vous devez générer un champ XML à partir d'une chaîne délimitée par des virgules.

Declare @ManagerIDs Varchar(100) 
Set @ManagerIDs = '3,6' 
DECLARE @XmlStr XML 
SET @XmlStr = 
--Start Tag 
'' + 
--Replace all commas with an ending tag and start a new tag 
REPLACE( @ManagerIDs, ',', '') + 
--End Tag 
''
Copier après la connexion

Ensuite, sélectionnez cette valeur XML et les résultats apparaîtront comme suit :

Select @XmlStr
Copier après la connexion

Maintenant que vous avez un champ XML, nous pouvons l'interroger et les résultats apparaîtront en ligne par ligne comme suit :

SELECT x.ManagerID.value('.', 'INT') AS A 
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
Copier après la connexion

Maintenant, vous pouvez limiter les résultats en utilisant la requête précédente :

SELECT * 
FROM HumanResources.Employee 
WHERE ManagerID IN( 
SELECT x.ManagerID.value('.', 'INT') AS A 
FROM @XmlStr.nodes('//ManagerID') x(ManagerID) 
)
Copier après la connexion

Alternativement, vous pouvez utiliser l'Inner Join pour limiter les résultats :

SELECT * 
FROM HumanResources.Employee AS A 
INNER JOIN 
(SELECT x.ManagerID.value('.', 'INT') AS ManagerID 
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)) B 
ON A.ManagerID = B.ManagerID
Copier après la connexion

Ci-dessus Le contenu pertinent est la description des instructions SQL ServerSQL non dynamiques pour exécuter des requêtes dynamiques. J'espère que cela vous apportera de l'aide à cet égard.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal