variable type statement sp_executesql parameter nchar expects example ejemplos sql dynamic sp-executesql

type - sp_executesql sql server



Pasar una variable TABLE a sp_executesql (4)

OK, esto me dará lo que quiero, pero seguramente no es bonito:

DECLARE @workingData TABLE ( col1 VARCHAR(20), col2 VARCHAR(20) ) INSERT INTO @workingData EXEC myProc /* Unfortunately table variables are outside scope for the dynamic SQL later run. We copy the table to a temp table. The table variable is needed to extract data directly from the strored procedure call above... */ SELECT * INTO #workingData FROM @workingData DECLARE @sql NVARCHAR(MAX) SET @sql = ''SELECT * FROM #workingData'' EXEC sp_executesql @sql

Debe haber una forma mejor de pasar este conjunto de resultados temporales a sp_executesql?

Saludos Alex

Estoy tratando de pasar una variable TABLE al procedimiento sp_executesql:

DECLARE @params NVARCHAR(MAX) SET @params = ''@workingData TABLE ( col1 VARCHAR(20), col2 VARCHAR(50) )'' EXEC sp_executesql @sql, @params, @workingData

Me sale el error:

Msg 156, Level 15, State 1, Line 1 Incorrect syntax near the keyword ''TABLE''.

Intenté omitir la especificación de la columna después de ''TABLE''. También traté de declarar la tabla como una variable dentro del SQL dinámico. Pero sin suerte ...

Me parece que las variables TABLE no se pueden pasar como parámetros en este procedimiento ?. Por cierto: estoy ejecutando MSSQL2008 R2.

No estoy interesado en usar una tabla temporal local como #workingData porque cargo los datos de trabajo de otro procedimiento:

INSERT INTO @workingData EXEC myProc @param1, @param2

Lo cual no puedo hacer directamente en un temp temporal (¿no?) ...

Cualquier ayuda apreciada!


Si bien esto puede no responder directamente a su pregunta, debería resolver su problema en general.

De hecho, puede capturar los resultados de una ejecución de Procedimiento almacenado en una tabla temporal:

INSERT INTO #workingData EXEC myProc

Así que cambie su código para que se parezca a lo siguiente:

CREATE TABLE #workingData ( col1 VARCHAR(20), col2 VARCHAR(20) ) INSERT INTO #workingData EXEC myProc DECLARE @sql NVARCHAR(MAX) SET @sql = ''SELECT * FROM #workingData'' EXEC sp_executesql @sql

Saludos, Tim


Si está utilizando SQL Server 2008, para pasar una variable de tabla a un procedimiento almacenado, primero debe definir el tipo de tabla, por ejemplo:

CREATE TYPE SalesHistoryTableType AS TABLE ( [Product] [varchar](10) NULL, [SaleDate] [datetime] NULL, [SalePrice] [money] NULL ) GO

o use un tipo de tabla existente almacenado en la base de datos.

Use esta consulta para localizar tipos de tablas existentes

SELECT * FROM sys.table_types

Para usar en un procedimiento almacenado, declare una variable de entrada como la tabla:

CREATE PROCEDURE usp_myproc ( @TableVariable SalesHistoryTableType READONLY ) AS BEGIN --Do stuff END GO

Complete la variable de la tabla antes de pasar al procedimiento almacenado:

DECLARE @DataTable AS SalesHistoryTableType INSERT INTO @DataTable SELECT * FROM (Some data)

Llame al procedimiento almacenado:

EXECUTE usp_myproc @TableVariable = @DataTable

Más discusiones here .


Alter PROCEDURE sp_table_getcount @tblname nvarchar(50) , @totalrow int output AS BEGIN Declare @params nvarchar(1000) Declare @sql nvarchar(1000) set @sql = N''Select @cnt= count(*) From @tbl'' set @params = N''@tbl nvarchar(50) , @cnt int OUTPUT'' Exec sp_executesql @sql , @params ,@tbl=@tblname , @cnt = @totalrow OUTPUT END GO

Tenga en cuenta que el código anterior no funcionará como una tabla ya que un objeto está fuera del alcance. Le dará el error: debe declarar la variable de la tabla. Para evitarlo, podemos hacer lo siguiente.

Alter PROCEDURE sp_table_getcount @tblname nvarchar(50) , @totalrow int output AS BEGIN Declare @params nvarchar(1000) Declare @sql nvarchar(1000) set @sql = N''Select @cnt= count(*) From dbo.'' + @tblname set @params = N''@cnt int OUTPUT'' Exec sp_executesql @sql , @params , @cnt = @totalrow OUTPUT END GO