Maison  >  Article  >  base de données  >  Explication détaillée de l'utilisation d'instructions SQL Server non dynamiques pour exécuter des requêtes dynamiques

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

怪我咯
怪我咯original
2017-07-05 11:06:001899parcourir

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)

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.

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)

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 
''

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

Select @XmlStr

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)

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) 
)

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

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!

Déclaration:
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
Article précédent:pt-osc en utilise unArticle suivant:pt-osc en utilise un