who stored sp_executesql log last executed example ejemplos dm_exec_query_stats tsql sql-server-2008 stored-procedures

tsql - sp_executesql - sql server log stored procedure execution



¿Cómo obtener el recuento de filas de EXEC() en un SPROC de TSQL? (6)

Al final del día, pero encontré este método mucho más simple:

-- test setup DECLARE @sqlBody nvarchar(max) = N''SELECT MyField FROM dbo.MyTable WHERE MyOtherField = ''''x''''''; DECLARE @ActualNumberOfResults int; -- the goods EXEC sp_executesql @sqlBody; SET @ActualNumberOfResults = @@ROWCOUNT; SELECT @ActualNumberOfResults;

Tengo una copia de TSQL que construye una consulta y la ejecuta de la siguiente manera:

EXEC (@sqlTop + @sqlBody + @sqlBottom)

@sqlTop contiene algo como SELECT TOP (x) col1, col2, col3 ...

TOP (x) limitará las filas devueltas, por lo que más adelante quiero saber cuál es el número real de filas en la tabla que coincide con la consulta.

Luego sustituyo @sqlTop con algo como:

EXEC (''SELECT @ActualNumberOfResults = COUNT(*) '' + @sqlBody)

Puedo ver por qué esto no funciona y por qué se produce un error de valor no declarado, pero creo que describe adecuadamente lo que estoy tratando de lograr.

¿Algunas ideas?


Después de ejecutar su consulta real, almacene el resultado de @@ROWCOUNT en cualquier variable que pueda usar más adelante.

EXEC sp_executesql ''SELECT TOP 10 FROM ABX''

SET @TotRecord = @@ROWCOUNT en tu variable para su uso posterior.


El único problema con las respuestas que crean tablas temporales (ya sea utilizando "DECLARE @rowcount TABLE" o "CREATE TABLE ## tempCounter (MyNum int)") es que tiene que leer todos los registros afectados del disco en la memoria. Si está esperando una gran cantidad de registros, esto puede llevar algún tiempo.

Entonces, si es probable que la respuesta sea grande, la solución "use sp_executesql y un parámetro de salida" es una respuesta más eficiente. Y parece funcionar.


En su lugar, podría hacer que la consulta dinámica devuelva el resultado como un conjunto de filas, que luego insertaría en una variable de tabla (también podría ser una tabla ordinaria o temporal) usando la sintaxis INSERT ... EXEC . Luego, simplemente puede leer el valor guardado en una variable utilizando SELECT @var = ... :

DECLARE @rowcount TABLE (Value int); INSERT INTO @rowcount EXEC(''SELECT COUNT(*) '' + @sqlBody); SELECT @ActualNumberOfResults = Value FROM @rowcount;


Tenga en cuenta que el SQL dinámico tiene su propio alcance. Cualquier variable declarada / modificada allí quedará fuera del alcance después de su EXEC o su sp_executesql .

Sugiera escribir en una tabla temporal, que estará dentro del alcance de su declaración de SQL dinámico, y en el exterior.

Tal vez ponerlo en su sqlBottom :

CREATE TABLE ##tempCounter(MyNum int); EXEC(''SELECT @ActualNumberOfResults = COUNT(*) '' + @sqlBody + ''; INSERT INTO ##tempCounter(MyNum) VALUES(@ActualNumberOfResults);''); SELECT MyNum FROM ##tempCounter;


usa sp_executesql y un output parameter

ejemplo

DECLARE @sqlBody VARCHAR(500),@TableCount INT, @SQL NVARCHAR(1000) SELECT @sqlBody = ''from sysobjects'' SELECT @SQL = N''SELECT @TableCount = COUNT(*) '' + @sqlBody EXEC sp_executesql @SQL, N''@TableCount INT OUTPUT'', @TableCount OUTPUT SELECT @TableCount GO