Si vous observez tous les problèmes d'injection, il s'agit de la manipulation best source pour la liste TSQL. Sans lire l'intégralité de l'article, voici ce qu'il faut pour créer une méthode TSQL très rapide et sans boucles pour séparer les chaînes.
Vous retrouvez avec une fonction split TSQL, et peut l'utiliser comme:
SELECT
y.*
FROM YourTable y
INNER JOIN dbo.FN_ListToTable(',','1,2,3,444,5,,,6') s ON y.ID=s.ListValue
from the previous article, I prefer the number table approach et c'est ce que vous devez faire pour la mettre en œuvre.
Pour que cette méthode fonctionne, vous devez effectuer cette configuration de la table une seule fois: Une fois la table des numéros est mis en place
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
, créez cette fonction:
CREATE FUNCTION [dbo].[FN_ListToTable]
(
@SplitOn char(1) --REQUIRED, the character to split the @List string on
,@List varchar(8000)--REQUIRED, the list to split apart
)
RETURNS TABLE
AS
RETURN
( ----------------
--SINGLE QUERY-- --this will not return empty rows
----------------
SELECT
ListValue
FROM (SELECT
LTRIM(RTRIM(SUBSTRING(List2, number+1, CHARINDEX(@SplitOn, List2, number+1)-number - 1))) AS ListValue
FROM (
SELECT @SplitOn + @List + @SplitOn AS List2
) AS dt
INNER JOIN Numbers n ON n.Number < LEN(dt.List2)
WHERE SUBSTRING(List2, number, 1) = @SplitOn
) dt2
WHERE ListValue IS NOT NULL AND ListValue!=''
);
GO
Vous pouvez maintenant facilement diviser une chaîne CSV dans une table et se joindre à elle:
select * from dbo.FN_ListToTable(',','1,2,3,,,4,5,6777,,,')
SORTIE:
ListValue
-----------------------
1
2
3
4
5
6777
(6 row(s) affected)
Votre peut passer dans une chaîne CSV dans une procédure et ne traiter que des lignes pour les ID donnés, ou tout simplement l'utiliser dans la requête comme:
SELECT
y.*
FROM YourTable y
INNER JOIN dbo.FN_ListToTable(',',@GivenCSV) s ON y.ID=s.ListValue
Ce qui est encore cette histoire xkcd? ;-) –
De toute évidence, nous voudrions qu'il utilise des requêtes/sprocs paramétrés, mais je ne pense pas que vous puissiez transmettre un paramètre de @var = "1,2,3,4" et ensuite faire un IN dessus . –
Ah, ça here. –