2010-10-01 16 views
83

ejecutar SQL dinámico de la siguiente manera en el procedimiento almacenado:resultado de SQL dinámico en una variable de SQL-servidor

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 

¿Cómo se utiliza la cuenta (*) Valor de columna como valor de retorno en el SP?

Respuesta

136
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, @[email protected] OUTPUT 
select @counts as Counts 
+2

+1: Me ganaste, necesito declarar una variable y marcarla como una SALIDA. [Para obtener más información y una lectura recomendada para el SQL dinámico de SQL Server, consulte La maldición y las bendiciones de SQL dinámico] (http://www.sommarskog.se/dynamic_sql.html#sp_executesql) –

+1

Gracias. La palabra clave OUTPUT en N '@ city nvarchar (75), @ cnt int OUTPUT' era lo que me faltaba. –

+0

¿No hay una solución que no requiera agregar una variable de salida a la declaración dinámica? –

2

Probablemente haya intentado esto, pero ¿sus especificaciones son tales que puede hacer esto?

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

O: @count SELECT = COUNT (*) FROM clientes DONDE Ciudad = @City – Sage

+0

comentario de Sage en realidad es el formato preferido. –

+0

@Sage, @OMG Ponies: buena llamada. Es una programación muy diferente en un cuadro de texto en la web. :) – Brad

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

Creo que tu respuesta fue cortada. – Sage

-1
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 ; 
+0

Esto no se aplica al servidor sql. –

0

versión dinámica

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 '[email protected]_table 
     EXECUTE sp_executesql @sqlCommand, N'@maxVal int OUTPUT',@[email protected] OUTPUT 
     DBCC CHECKIDENT(@p_table, RESEED, @maxVal) 
    END 


exec dbo.ReseedTableIdentityCol @p_table='Junk' 
0

esto podría ser una solución?

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 
Cuestiones relacionadas