T-SQL은 문자열을 다중 관계로 분할합니까?
-
11-09-2019 - |
문제
다음 SQL 스크립트가 있습니다.
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
그리고 클릭 한 후! 실행 후, 나는 이것들을 얻었다.
Line 17 The multi-part identifier "T.data" could not be bound.
또한 비 조인 버전을 시도했으며 동일한 오류가 발생했습니다.
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T, dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID
...
내가 기대했던 것은 @test.id에서 ID가있는 테이블을 가져와야하고 @test.data의 각 쉼표로 구분 된 값은 자체 레코드로 나뉘어지고 값이 데이터 시템 필드로 나뉩니다.
어떻게 달성 할 수 있습니까?
커서를 사용해야합니까?
나는 dbo .__ stringsplit 테이블 값 기능 구현을 붙여 넣었다 http://pastebin.com/f7dd6350f
감사!
해결책
SQL2000에는 커서가 필요합니다. SQL2005/2008에서는 Cross Apply Secement를 사용할 수 있습니다. 아마도 다음과 같을 것입니다 (지금은 테스트 할 수 없습니다) :
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T CROSS APPLY dbo.__StringSplit(T.data, ',', T.ID) AS S
편집하다 - 나는 찾았다 크로스 의이 페이지가 적용됩니다 그런 다음 다음과 같이 생각했습니다.
SELECT T.ID, S.Item AS dataItem
FROM @temp AS T
CROSS APPLY
dbo.__StringSplit(T.data, ',', T.ID) AS S
WHERE T.ID = S.RefID
내 문제를 해결했습니다 :-)
다른 팁
분할 문자열 기능은 정말 느립니다. 다음은 훨씬 더 빨리 만들 수있는 링크가 있습니다.
제휴하지 않습니다 StackOverflow