2017-04-05 50 views
0

我正在使用EXEC语句,并且OUTPUT始终为NULL。这对我来说是个问题。我需要一些方法来确定INSERT语句是否成功。或者,我可以删除查询的@bogusTable和INSERT部分,并测试底层的SELECT语句是否收集到任何结果,但我总是在该OUTPUT上获得NULL。SQL Server EXEC OUTPUT总是NULL

下面是该查询:

SET @mainQuery = ' 
       DECLARE @bogusTable TABLE(
        someField VARCHAR(MAX) NULL 
       ); 

       INSERT INTO @bogusTable SELECT someField FROM someTable WHERE anINT = ' @randINT 

EXEC sp_executesql @mainQuery, N'@tempParam INT OUTPUT', @[email protected] OUTPUT 

IF (@someInt IS NULL) 
BEGIN 
    --This always executes even when the INSERT statement in @mainQuery doesn't insert anything 
END 
+1

这不是你应该如何添加'@ randINT'到执行的SQL语句。你在哪里设定'@ tempParam'的值?我看到声明和输出的期望,但是在执行的脚本中,它为'@ tempParam'分配一个值? – SqlZim

+0

如果你打算在参数中使用'sp_executesql',为什么你仍然在粗略的字符串连接中插入'@ randInt'的值? –

+0

如果添加一个'DECLARE @tempParam INT'高于一切,它每次都会输出NULL。 另外,我有理由需要'@ mainQuery'来注入'@ randInt',这超出了这个问题的范围。 –

回答

0

你不是在你的动态SQL设置@tempParam,所以它当然是空的。您可以将其设置为@@rowcount以查看是否插入了任何行。

试试这个:

declare @randINT int; 
--set @randINT here! 

declare @mainQuery nvarchar(max); 
declare @someInt int; 
SET @mainQuery = ' 
       DECLARE @bogusTable TABLE(
        someField VARCHAR(MAX) NULL 
       ); 

       INSERT INTO @bogusTable SELECT someField FROM someTable WHERE anINT = @randINT; 
       select @tempParam = @@rowcount;' 

EXEC sp_executesql @mainQuery, N'@randINT int, @tempParam INT OUTPUT', @[email protected], @[email protected] OUTPUT 

IF (@someInt > 0) 
BEGIN 
    --This will only execute if something was inserted 
    select @someInt as row_count; 
END 

通知,我还带了@randINT到正确的参数。

0

@BeanFrog非常接近。

这正是我需要的:

SET @mainQuery = ' 
       DECLARE @bogusTable TABLE(
        someField VARCHAR(MAX) NULL 
       ); 

       INSERT INTO @bogusTable SELECT someField FROM someTable WHERE anINT = ' + @randINT + '; 
       SET @tempParam = @@ROWCOUNT;' 

EXEC sp_executesql @mainQuery, N'@tempParam INT OUTPUT', @[email protected] OUTPUT 

IF (@someInt = 0) 
BEGIN 
    --This executes correctly now 
END