2013-08-06 2 views
1

실패한 테이블 반환 함수에 조인했습니다. 설명 할 수 없습니다. 나는 아래에 테스트 스크립트를 만들었고 SQL Server 2008 R2에서이 스크립트를 실행했습니다.테이블 반환 함수에 조인하지 못했습니다.

테스트 스크립트가 끝날 때 첫 번째 SELECT 문이 작동하고 두 번째 문이 작동하지 않는 이유를 이해할 수 있습니까?

CREATE TABLE dbo.Test (Setting INT NOT NULL, Value NVARCHAR(MAX) NULL) 

GO 

INSERT dbo.Test (Setting, Value) 
SELECT 3151, '2~-10011;2~-10012' 

GO 

CREATE FUNCTION [dbo].[CTESplitChunk] (@list nvarchar(MAX), 
           @delim nchar(1) = ',') 
RETURNS @t TABLE (str nvarchar(4000) NOT NULL) AS 
BEGIN 
    DECLARE @slice nvarchar(4000), 
      @textpos int, 
      @maxlen int, 
      @stoppos int, 
      @lastone bit 

    SELECT @textpos = 1, @maxlen = 4000 - 2, @lastone = 0 
    WHILE @lastone = 0 
    BEGIN 
     IF datalength(@list)/2 - (@textpos - 1) >= @maxlen 
     BEGIN 
     SELECT @slice = substring(@list, @textpos, @maxlen) 
     SELECT @stoppos = @maxlen - 
          charindex(@delim COLLATE Slovenian_BIN2, reverse(@slice)) 
     SELECT @slice = left(@slice, @stoppos) + @delim 
     SELECT @textpos = @textpos - 1 + @stoppos + 2 -- On the other side of the comma. 
     END 
     ELSE 
     SELECT @slice = substring(@list, @textpos, @maxlen) + @delim, 
       @lastone = 1 

     ;WITH csvtbl(start, stop) AS (
     SELECT start = 1, 
       stop = charindex(@delim COLLATE Slovenian_BIN2, @slice) 
     UNION ALL 
     SELECT start = stop + 1, 
       stop = charindex(@delim COLLATE Slovenian_BIN2, 
            @slice, stop + 1) 
     FROM csvtbl 
     WHERE stop > 0 
    ) 
     INSERT @t (str) 
     SELECT ltrim(rtrim(
       substring(@slice, start, 
          CASE WHEN stop > 0 THEN stop - start ELSE 0 END))) 
     FROM csvtbl 
     WHERE stop > 0 
     OPTION (MAXRECURSION 0) 
    END 

    RETURN 
END 

GO 

SELECT   Value 
FROM   dbo.Test t 
WHERE   t.Setting = '3151' 

GO 

SELECT   Value 
FROM   dbo.Test t 
    INNER JOIN dbo.CTESplitChunk (t.Value, ';') s ON 1 = 1 
WHERE   t.Setting = '3151' 

답변

1

correlated 매개 변수를 사용하여 TVF를 호출하려면 CROSS APPLY이 필요합니다.

SELECT t.Value, 
     s.* 
FROM dbo.Test t 
     CROSS APPLY dbo.CTESplitChunk (t.Value, ';') s 
WHERE t.Setting = '3151' 
+0

그래, 고마워, 게시 후 나에게 떠올랐다! 학교 소년 오류 :-) – Drammy

+0

이제는이 답변이 이상하게 보이는 질문에 'CROSS APPLY'코드를 추가했습니다. 왜't.Value'에 따라 그 내용을 바꿀 수있는 테이블 표현식에 조인하는 것이 합리적이지 않은가. 내부 조인은 교환 가능해야합니다. TVF에서 어떻게 참여할 수 있습니까? –

+0

Understanding - 답변을보기 전에 추가했습니다. 나중에 참조 할 수 있도록 수정 내용을 제거하겠습니다. – Drammy

관련 문제