Obtenir le résultat du SQL dynamique dans une variable pour sql-server

116

Exécution de SQL dynamique comme suit dans la procédure stockée:

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

Comment utiliser la valeur de la colonne count (*) comme valeur de retour dans le SP?

Peter Lindholm
la source

Réponses:

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
sauge
la source
4
+1: Vous m'avez battu, vous devez déclarer une variable et la marquer comme SORTIE. Pour plus d'informations et une lecture recommandée pour SQL Server dynamique SQL, voir La malédiction et les bénédictions du SQL dynamique
OMG Ponies
1
Je vous remercie. Le mot-clé OUTPUT dans N '@ city nvarchar (75), @ cnt int OUTPUT' était ce qui me manquait.
Peter Lindholm
1
N'y a-t-il pas de solution qui ne nécessite pas d'ajouter une variable de sortie à l'instruction dynamique ???
Tab Alleman
2

Vous avez probablement essayé cela, mais vos spécifications vous permettent-elles de le faire?

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

version dynamique

    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
la source
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
la source
1
Je pense que votre réponse a été interrompue.
Sage
Msg 137, Must declare the scalar variable "@cnt". Msg 178, A RETURN statement with a return value cannot be used in this context.. A nice piece of work, bro))
it3xl
0

cela pourrait être une solution?

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
la source
-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
la source
Cela ne s'applique pas au serveur SQL.
Robert Lujo