2013-01-17 2 views
2

SSRS RDL 문서를 제공하기위한 SQL 스크립트에서 CTE를 반복적으로 사용하여 데이터를 가져 오려고합니다.NULL 앵커가 NOT NULL 필드에서 반복 될 때 CTE의 형식 불일치 문제를 해결하는 방법

실제 SQL 코드는 여기 CopyPaste에에 너무 큰하지만이 짧은 생식 만들어이 같은

declare @temp table 
(
id uniqueidentifier not null default(newid()), 
name varchar(100) not null default('new'), 
value varchar(100) not null default('newValue'), 
parentid uniqueidentifier null 
) 

insert into @temp (id, name, value, parentid) values ('12312312-1234-1234-1234-123412341234', 'o1', 'val1', null) 
insert into @temp (id, name, value, parentid) values ('12312312-1234-1234-1234-123412341235', 'o2', 'val2', '12312312-1234-1234-1234-123412341234') 
insert into @temp (id, name, value, parentid) values ('12312312-1234-1234-1234-123412341236', 'o3', 'val3', '12312312-1234-1234-1234-123412341234') 

;with 
    cte(id,name, value, pid, pname, pvalue) as (
     select id, name, value, null, null, null from @temp where parentid is null 
     union all 
     select r.id, r.name, r.value, a.id, a.name, a.value 
     from @temp r inner join cte a 
     on a.id = r.parentid 
    ) 
    select * from cte 

CTE에 오류 출력 (2012 SSMS에서 테스트) :

Msg 240, Level 16, State 1, Line 13 
Types don't match between the anchor and the recursive part in column "pid" of recursive query "cte". 
Msg 240, Level 16, State 1, Line 13 
Types don't match between the anchor and the recursive part in column "pname" of recursive query "cte". 
Msg 240, Level 16, State 1, Line 13 
Types don't match between the anchor and the recursive part in column "pvalue" of recursive query "cte". 

을 나는 이것이 재귀 부분에서 반입 된 NOT NULL 필드와는 대조적으로 앵커 부분에서 선택된 NULL 값 때문이라고 확신한다 ...이 문제는 해결 될 수 있습니까?

는 (나는이 작업을 달성하는 다른 방법에 열려있어.) 리터럴 null 값이 일치하는

답변

3

캐스트.

;with 
cte(id,name, value, pid, pname, pvalue) as (
    select id, name, value, cast(null as uniqueidentifier), 
     cast(null as varchar(100)), cast(null as varchar(100)) 
    from @temp where parentid is null 
    union all 
    select r.id, r.name, r.value, a.id, a.name, a.value 
    from @temp r inner join cte a 
    on a.id = r.parentid 
) 

그렇지 않으면 SQL은 노조의 두 번째 부분과 일치하지 각 null의 기본 유형 int을 가정합니다.

+0

사실 'NULL'로 간주되는 기본값은 'INT'입니다. –

+0

감사합니다 마틴, 당신이 대답을 팝업 수도 있습니다. 편집 된 광산. –

+0

향후 독자의 혼란을 피하기 위해 질문의 테이블 사양과 일치하도록 코드를 변경했습니다. – Alex