2017-04-05 75 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