2017-07-15 1 views
0

Je souhaite séparer les chaînes par des virgules. En fait, je veut filtrer dans WHERE article commeComment séparer une chaîne par une virgule à l'aide de SQL Server?

CREATE PROC spGetRecords 
@class varchar(50) 
AS 
BEGIN 
    SELECT * 
    FROM SampleTable 
    WHERE class in (@class) --in Database class is an integer 
END 

Alors, je veux passer le paramètre lors d'exécuter la requête comme ci-dessous

spGetRecords @class = '12,22,45,66' 

Je pense qu'il est impossible de passer la valeur multiple dans un seul paramètre dans mon Cas.

Donc, si je supprime séparer la chaîne par ',' puis je peux exécuter ma requête dans la boucle while qui va apporter l'enregistrement correct?

Alors, comment puis-je séparer la chaîne par virgule

+0

Qu'est-ce SGBDR et la version que vous utilisez. – Igor

+0

Utilisez SQL dynamique: 'exec 'sélectionnez ...'' –

+0

@Igor 'Microsoft SQL Server 2012 11.0.2100.60' –

Répondre

3

Vous pouvez diviser en utilisant le chemin de XML ci-dessous:

Declare @delimiter nvarchar(max) = ',' 
Declare @str nvarchar(max) = '12,22,45,66' 

Declare @xml as xml 
     Select @xml = CAST('<x>' + REPLACE((SELECT REPLACE(@str,@delimiter,'$$$SSText$$$') AS [*] FOR XML PATH('')),'$$$SSText$$$','</x><x>')+ '</x>' AS XML) 

--select @xml 
Select y.value(N'text()[1]', N'nvarchar(MAX)') as value 
FROM @xml.nodes(N'x') as x(y) 

Si vous êtes dans SQL Server> = 2016 vous pouvez utiliser STRING_SPLIT() comme ci-dessous:

Select * from string_split('12,22,45,66',',') 
+0

votre réponse est correcte. Mais avant que je donne correctement, pouvez-vous donner des explications sur les troisième et quatrième lignes? merci –

+0

Essayez de sélectionner des lignes individuelles que vous comprendrez, la première étape convertir en XML en utilisant le chemin xml, tout en créant des noeuds je change de virgule/délimiteur en tant que noeud séparé et deuxième ligne traversant tous les nœuds –

0

Voici une bonne solution - Converting String List into Int List in SQL. L'idée ici est d'envoyer une liste int à une procédure stockée en tant que paramètre XML.

Voici une autre solution rapide mais sale: t-sql Convert comma separated string into int, without using user created function. Ici, la valeur transmise est utilisée dans une instruction SQL dynamique.

Plus d'idées - http://sql-articles.com/scripts/function-to-split-comma-separated-string-to-integer/

0

Utiliser SQL dynamique

exec 'SELECT * FROM SampleTable WHERE class in (' + @class + ')' 

qui patcher les cordes ensemble, puis l'exécuter comme ceci:

SELECT * FROM SampleTable WHERE class in (12,22,45,66) 
+0

La classe est un entier –

+0

Avez-vous essayé le question? –

+0

c'est une requête multiligne, pas une seule ligne. Pour donner un exemple seulement j'ai mentionné le tableau de l'échantillon .. Mais en fait c'est une requête peu longue –