Mendapatkan hasil SQL dinamis menjadi variabel untuk sql-server

116

Menjalankan SQL dinamis sebagai berikut dalam Prosedur Tersimpan:

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

Bagaimana cara menggunakan nilai kolom count (*) sebagai nilai pengembalian di SP?

Peter Lindholm
sumber

Jawaban:

203
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
Sage
sumber
4
+1: Anda mengalahkan saya untuk itu, perlu mendeklarasikan variabel, dan menandainya sebagai OUTPUT. Untuk info selengkapnya, dan bacaan yang direkomendasikan untuk SQL Server dinamis SQL, lihat Kutukan dan berkah dari SQL dinamis
OMG Ponies
1
Terima kasih. Kata kunci OUTPUT di N '@ city nvarchar (75), @ cnt int OUTPUT' adalah apa yang saya lewatkan.
Peter Lindholm
1
Apakah tidak ada solusi yang tidak memerlukan penambahan variabel keluaran ke pernyataan dinamis ???
Tab Alleman
2

Anda mungkin pernah mencobanya, tetapi apakah spesifikasi Anda sedemikian rupa sehingga Anda dapat melakukan ini?

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

versi dinamis

    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
sumber
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
sumber
1
Saya pikir jawaban Anda terputus.
Sage
Psn 137, Must declare the scalar variable "@cnt". Psn 178 A RETURN statement with a return value cannot be used in this context.,. Karya yang bagus, bro))
it3xl
0

ini bisa menjadi solusi?

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
sumber
-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
sumber
Ini tidak berlaku untuk server sql.
Robert Lujo