SQL Server EXEC OUTPUT始终为NULL

时间:2017-04-05 13:05:01

标签: sql sql-server stored-procedures

我正在使用EXEC语句,OUTPUT始终为NULL。这对我来说是一个问题。我需要一些方法来识别INSERT语句是否成功。或者,我可以删除查询的@bogusTable和INSERT部分,只测试底层SELECT语句是否收集了任何结果,但我也总是在该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', @tempParam=@someInt OUTPUT

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

2 个答案:

答案 0 :(得分:0)

您没有在动态sql中设置@tempParam,所以当然它是null。您可以将其设置为@@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', @randINT=@randINT, @tempParam=@someInt OUTPUT

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

注意,我还正确地将@randINT带入了参数。

答案 1 :(得分: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', @tempParam=@someInt OUTPUT

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