2017-11-30 22 views
0

트리거의 코드 부분이 있습니다. 내 방아쇠를 테스트 할 때 내 임원이 데이터를 반환하지 않습니다. 선택 여기EXEC sp_executesql이 작동하지 않거나 데이터를 반환하지 않습니다.

declare 
    @sql nvarchar(MAX), 
    @SQLString varchar(MAX) 

과 :로

내가 내 간부 값을 선언

set @sql = N'select ' 
     set @sql = @sql + '@SQLString = convert(varchar(1000),d.' + @fieldname + ')' +' + convert(varchar(1000),i.' + @fieldname + ')' 
set @sql = @sql + ' from #ins i full outer join #del d' 
set @sql = @sql + @PKCols -- 
set @sql = @sql + ' where i.' + @fieldname + ' <> d.' + @fieldname 
set @sql = @sql + ' or (i.' + @fieldname + ' is null and d.' + @fieldname + ' is not null)' 
set @sql = @sql + ' or (i.' + @fieldname + ' is not null and d.' + @fieldname + ' is null)' 

(모든 변수가 잘 작동) : 나는 @Sql 인쇄하면이 같은 것처럼 ->

012 : 여기

select @SQLString = convert(varchar(1000), d.ActionID) + convert(varchar(1000), i.ActionID) 
from #ins i 
full outer join #del d on i.ActionID = d.ActionID 
where i.ActionID <> d.ActionID 
    or (i.ActionID is null and d.ActionID is not null) 
    or (i.ActionID is not null and d.ActionID is null) 

실행은 인

하지만 인쇄는 아무것도 보여줍니다 :

print '@SQLString:' + @SQLString; 

답변

0

select 문을 조사하십시오. 일부 테스트 데이터에서 실행하면 # & #del의 # 두 ActionID가 모두 null이 아니며 하나는 항상 null입니다. 당신이 null이 아닌 및 null 문자열을 추가로 연결

즉 다음 널 (null)을 반환하고 @SQLString 결과로 null의

convert(varchar(1000), d.ActionID) + convert(varchar(1000), i.ActionID) 

.

일부 테스트 코드는 내가 함께 던졌다 :

CREATE TABLE #ins 
(
    ActionID INT 
) 

CREATE TABLE #del 
(
    ActionID INT 
) 

INSERT INTO #ins 
VALUES (1),(3),(5),(7),(9) 

--Data sets mostly disjoint, have 1 overlapping value to see what happens. 
INSERT INTO #del 
VALUES (2),(4),(6),(8),(9),(10) 

--Visual demo of return values. 
SELECT * 
FROM #ins i 
    FULL OUTER JOIN #del d ON i.ActionID = d.ActionID 
WHERE i.ActionID != d.ActionID 
     OR (i.ActionID IS NULL AND d.ActionID IS NOT NULL) 
     OR (i.ActionID IS NOT NULL AND d.ActionID IS NULL) 

--Original SQL to demonstrate NULL return value. 
DECLARE @sql NVARCHAR(MAX) = 'SELECT @SQLString = CONVERT(NVARCHAR(1000), d.ActionID) + CONVERT(NVARCHAR(1000), i.ActionID) FROM #ins i FULL OUTER JOIN #del d ON i.ActionID = d.ActionID WHERE i.ActionID != d.ActionID OR (i.ActionID IS NULL AND d.ActionID IS NOT NULL) OR (i.ActionID IS NOT NULL AND d.ActionID IS NULL)' 
     ,@SQLString NVARCHAR(MAX) 

EXEC sp_executesql @sql, N'@SQLString NVARCHAR(MAX) OUTPUT', @SQLString = @SQLString OUTPUT 

SELECT @SQLString 

--Modified original vars/sql and wrapped in ISNULL to demonstrate non-null return value. 
DECLARE @sql2 NVARCHAR(MAX) = 'SELECT @SQLString = CONVERT(NVARCHAR(1000), ISNULL(d.ActionID,0)) + ''-'' + CONVERT(NVARCHAR(1000), ISNULL(i.ActionID,0)) FROM #ins i FULL OUTER JOIN #del d ON i.ActionID = d.ActionID WHERE i.ActionID != d.ActionID OR (i.ActionID IS NULL AND d.ActionID IS NOT NULL) OR (i.ActionID IS NOT NULL AND d.ActionID IS NULL)' 
     ,@SQLString2 NVARCHAR(MAX) 

EXEC sp_executesql @sql2, N'@SQLString NVARCHAR(MAX) OUTPUT', @SQLString = @SQLString OUTPUT 

SELECT @SQLString 
+1

고마워요! NULL을 확인한 후 작동했습니다 :) – Ange

+0

굉장! 다행 :) –

0

문자열로 널을 연결하는 '+'연산자를 사용하여, 당신은 널을 얻을 수 있습니다.

대신 CONCAT 함수를 사용하십시오. 인수를 문자열로 변환하고 Null을 빈 문자열처럼 취급합니다.

+0

우리는 SQL 2008을 사용하고 내가 CONCAT 2012에서 사용할 수 있습니다 생각하지만 당신의 추천에 감사드립니다! – Ange