T-SQL Scinde une chaîne en relation many-to-one?
-
11-09-2019 - |
Question
Je le script SQL suivant:
DECLARE @temp table (
ID int IDENTITY(1, 1),
data nvarchar(100)
)
INSERT INTO @temp (data) VALUES ('a,b,c')
INSERT INTO @temp (data) VALUES ('d,e,f')
SELECT *
FROM @temp AS T
INNER JOIN
(SELECT *
FROM dbo.__StringSplit(T.data, ',', T.ID)) AS S
ON T.ID = S.RefID
! Et après avoir cliqué sur Exécuter, je suis arrivé ces:
Line 17 The multi-part identifier "T.data" could not be bound.
J'ai aussi essayé la version non-join et a obtenu la même erreur:
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID
...
Ce que je pensais était que j'obtient une table avec les ID provenant de @ test.ID et chacune des valeurs séparées par des virgules dans @ test.data obtient divisé en ses propres dossiers et sa valeur mettre dans le champ DataItem .
Comment puis-je accomplir cela?
Suis-je obligé d'utiliser les curseurs?
J'ai collé le dbo .__ StringSplit de mise en œuvre fonction de table d'une valeur de http://pastebin.com/f7dd6350f
Merci!
La solution
Dans SQL2000 vous avez besoin des curseurs. En SQL2005 / 2008, vous pouvez utiliser CROSS APPLY satement; probablement comme à côté (ne peut pas tester tout à l'heure):
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S
Autres conseils
votre fonction Éclate une chaîne est très lent, voici un lien pour faire beaucoup plus rapidement un: