문제

다음 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

내 문제를 해결했습니다 :-)

다른 팁

분할 문자열 기능은 정말 느립니다. 다음은 훨씬 더 빨리 만들 수있는 링크가 있습니다.

http://www.sommarskog.se/arrays-in-sql.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top