Sql server EXEC sp_executesql不工作或不返回数据

Sql server EXEC sp_executesql不工作或不返回数据,sql-server,exec,sp-executesql,Sql Server,Exec,Sp Executesql,我有触发器的代码部分。当我测试触发器时,我的exec不会返回任何数据 我将我的exec值声明为: declare @sql nvarchar(MAX), @SQLString varchar(MAX) 以下是选择: set @sql = N'select ' set @sql = @sql + '@SQLString = convert(varchar(1000),d.' + @fieldname + ')' +' + convert(varchar(

我有触发器的代码部分。当我测试触发器时,我的exec不会返回任何数据

我将我的exec值声明为:

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)' 
但印刷品什么也看不出来:

print '@SQLString:' + @SQLString;

使用“+”运算符将Null与字符串连接时,将得到Null


改为使用该函数。它为您将参数转换为字符串,并将Null视为空字符串。

调查您的select语句,在某些测试数据上运行此语句时,没有返回ins和del的ActionID均为非Null的情况,而我的一个始终为Null

这将导致您添加一个非null和一个null字符串,即

convert(varchar(1000), d.ActionID) + convert(varchar(1000), i.ActionID)
然后返回null,结果@SQLString为null

我收集了一些测试代码:

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

我们使用SQL 2008,我认为Concat从2012年开始提供。但是谢谢你的推荐!令人惊叹的很高兴听到:
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