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?

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

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

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'

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

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

-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 ;

Ini tidak berlaku untuk server sql.
Robert Lujo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.