Dinamik SQL'in sonucunu sql-server için bir değişkene alma


116

Dinamik SQL'i Depolanan Prosedürde aşağıdaki gibi yürütmek:

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

SP'de count (*) sütun değerini dönüş değeri olarak nasıl kullanırım?

Yanıtlar:


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: Beni yeniyorsun, bir değişken tanımlaman ve onu ÇIKTI olarak işaretlemelisin. Daha fazla bilgi ve SQL Server dinamik SQL için önerilen bir okuma için bkz. Dinamik SQL'in laneti ve kutsamaları
OMG Ponies

1
Teşekkür ederim. N '@ city nvarchar (75), @ cnt int OUTPUT' içindeki OUTPUT anahtar sözcüğü eksik olan şeydi.
Peter Lindholm

1
Dinamik ifadeye bir çıktı değişkeni eklemeyi gerektirmeyen bir çözüm yok mu ???
Tab Alleman

2

Muhtemelen bunu denediniz, ancak spesifikasyonlarınız bunu yapabilecek kadar mı?

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

2

dinamik versiyon

    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
Sanırım cevabın kesildi.
Sage

Msg 137, Must declare the scalar variable "@cnt". Msg 178 A RETURN statement with a return value cannot be used in this context.,. Güzel bir iş, kardeşim))
it3xl

0

bu bir çözüm olabilir mi?

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 ;

Bu, sql sunucusu için geçerli değildir.
Robert Lujo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.