Abrufen des Ergebnisses von dynamischem SQL in eine Variable für SQL Server

116

Ausführen von dynamischem SQL wie folgt in Gespeicherte Prozedur:

DECLARE @sqlCommand nvarchar(1000)
DECLARE @city varchar(75)
SET @city = 'London'
SET @sqlCommand = 'SELECT COUNT(*) FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city

Wie verwende ich den Spaltenwert count (*) als Rückgabewert im SP?

Peter Lindholm
quelle

Antworten:

202
DECLARE @sqlCommand nvarchar(1000)
DECLARE @city varchar(75)
declare @counts int
SET @city = 'New York'
SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75),@cnt int OUTPUT', @city = @city, @cnt=@counts OUTPUT
select @counts as Counts
Salbei
quelle
4
+1: Du hast mich geschlagen, musst eine Variable deklarieren und sie als OUTPUT markieren. Weitere Informationen und eine empfohlene Lektüre für dynamisches SQL Server-SQL finden Sie unter Der Fluch und der Segen von dynamischem SQL
OMG Ponies
1
Danke dir. Das Schlüsselwort OUTPUT in N '@ city nvarchar (75), @ cnt int OUTPUT' fehlte mir.
Peter Lindholm
1
Gibt es keine Lösung, bei der der dynamischen Anweisung keine Ausgabevariable hinzugefügt werden muss?
Tab Alleman
2

Sie haben dies wahrscheinlich versucht, aber sind Ihre Spezifikationen so, dass Sie dies tun können?

DECLARE @city varchar(75)
DECLARE @count INT
SET @city = 'London'
SELECT @count = COUNT(*) FROM customers WHERE City = @city
Brad
quelle
2

dynamische Version

    ALTER PROCEDURE [dbo].[ReseedTableIdentityCol](@p_table varchar(max))-- RETURNS int
    AS
    BEGIN
        -- Declare the return variable here
       DECLARE @sqlCommand nvarchar(1000)
       DECLARE @maxVal INT
       set @sqlCommand = 'SELECT @maxVal = ISNULL(max(ID),0)+1 from '+@p_table
       EXECUTE sp_executesql @sqlCommand, N'@maxVal int OUTPUT',@maxVal=@maxVal OUTPUT
       DBCC CHECKIDENT(@p_table, RESEED, @maxVal)
    END


exec dbo.ReseedTableIdentityCol @p_table='Junk'
Ab Bennett
quelle
0
DECLARE @sqlCommand nvarchar(1000)
DECLARE @city varchar(75)
DECLARE @cnt int
SET @city = 'London'
SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city
RETURN @cnt
CristiC
quelle
1
Ich denke, deine Antwort wurde abgeschnitten.
Salbei
Msg 137, Must declare the scalar variable "@cnt". Msg 178 , A RETURN statement with a return value cannot be used in this context.. Ein schönes Stück Arbeit, Bruder))
it3xl
0

das könnte eine lösung sein?

declare @step2cmd nvarchar(200)
DECLARE @rcount NUMERIC(18,0)   
set @step2cmd = 'select count(*) from uat.ap.ztscm_protocollo' --+ @nometab
EXECUTE @rcount=sp_executesql @step2cmd
select @rcount
Stefano Pedone
quelle
-2
 vMYQUERY := 'SELECT COUNT(*) FROM ALL_OBJECTS WHERE OWNER = UPPER(''MFI_IDBI2LIVE'') AND OBJECT_TYPE = ''TABLE'' 
    AND OBJECT_NAME  =''' || vTBL_CLIENT_MASTER || '''';
    PRINT_STRING(VMYQUERY);
    EXECUTE IMMEDIATE  vMYQUERY INTO VCOUNTTEMP ;
PaOne
quelle
Dies gilt nicht für SQL Server.
Robert Lujo