colonne de table a des valeurs séparées par des virgules avec par ex: (1,2,3)Comment utiliser split dans SQL Server 2005?
Comment diviser cela comme
1
2
3
ou
1 2 3
dans SQL Server 2005.
colonne de table a des valeurs séparées par des virgules avec par ex: (1,2,3)Comment utiliser split dans SQL Server 2005?
Comment diviser cela comme
1
2
3
ou
1 2 3
dans SQL Server 2005.
Il n'y a pas de fonction intégrée, mais voici un post du forum que les gens montrent de nombreuses méthodes. Il y a quelques exemples spécifiques de 2005 là-dedans. J'en ai déjà utilisé deux. http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648
En voici une, retourne une table.
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, CHARINDEX(@sep, @s)
UNION ALL
SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,
SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
GO
il y a plusieurs façons de Éclate une chaîne dans SQL Server 2005. Cet article porte sur les avantages et les inconvénients de chaque méthode à peu près:
Vous devez créer une fonction split. Voici comment une fonction split peut être utilisé:
SELECT
*
FROM YourTable y
INNER JOIN dbo.yourSplitFunction(@Parameter) s ON y.ID=s.Value
I prefer the number table approach to split a string in TSQL mais il existe de nombreuses façons de diviser les chaînes dans SQL Server, voir le lien précédent, ce qui explique les avantages et les inconvénients de chacun.
Pour la méthode de table de nombres au travail, vous devez faire une configuration de table de temps, ce qui va créer une table Numbers
qui contient des lignes de 1 à 10 000:
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)
Une fois la table des numéros est mis en place , créez cette fonction split:
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 découper 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 utiliser la chaîne CSV comme celui-ci, pas table temporaire nécessaire:
SELECT * FROM tblMyTable
INNER JOIN /*Bunch of inner joins here*/
WHERE ItemID IN (select ListValue from dbo.FN_ListToTable(',',@MyList));
Ou chercher? http://stackoverflow.com/search?q=sql+split <- il doit y avoir quelque chose ici pour vous aider. –