2017-04-05 4 views
0

Ich verwende eine EXEC-Anweisung und die OUTPUT ist immer NULL. Das ist ein Problem für mich. Ich brauche eine Möglichkeit, festzustellen, ob eine INSERT-Anweisung erfolgreich war oder nicht. Alternativ könnte ich den @bogusTable- und den INSERT-Teil der Abfrage entfernen und einfach testen, ob die zugrundeliegende SELECT-Anweisung irgendwelche Ergebnisse gesammelt hat, aber ich habe NULL immer auch auf diesem OUTPUT erhalten. HierSQL Server EXEC OUTPUT immer Null

ist die Abfrage:

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

Das ist nicht, wie Sie '@ randINT' zu Ihrer ausgeführten SQL-Zugabe werden sollte. Wo setzen Sie einen Wert für '@ tempParam'? Ich sehe die Deklaration und die Erwartung der Ausgabe, aber wo in dem ausgeführten Skript gibt es einen Wert zu @ tempParam? – SqlZim

+0

Und wenn Sie sich bemühen, 'sp_executesql' mit Parametern zu verwenden, warum machen Sie immer noch grobe String-Verkettungen, um den Wert von' @ randInt' in sie einzufügen? –

+0

Wenn Sie eine DECLARE @tempParam INT über allem hinzufügen, wird immer NULL ausgegeben. Auch habe ich Gründe dafür, '@ mainQuery' zu benötigen, um' @ randInt' einzufügen, was den Rahmen dieser Frage sprengen würde. –

Antwort

0

Sie sind nicht @tempParam in Ihrer dynamischen SQL-Einstellung, so natürlich ist es null ist. Sie können es auf @@rowcount setzen, um festzustellen, ob Zeilen eingefügt wurden.

Versuchen Sie folgendes:

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 

Hinweis, ich richtig auch @randINT in die Parameter gebracht.

0

@BeanFrog war ziemlich nah.

Das ist, was ich brauchte:

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