sp_executesql sp_execute example ejecutar commands sql sql-server sql-server-2008 stored-procedures dynamic-sql

sp_execute - Error de SQL dinámico al convertir nvarchar a int



sp_executesql output (2)

Necesita REPARTIR todos los números a nvarchar en la concatenación.

No hay una conversión de estilo VBA implícita a la cadena. En el tipo de datos de SQL Server, la precedencia significa que las entradas son más altas que nvarchar: por lo que toda la cadena intenta ser CAST a int.

SET @SQL = ''SELECT '' + @GName + '' AS GrName ,'' + @BR + CAST(@T_ID AS nvarchar(10)) + '' AS To_ID ,'' ...

Editar: Will A tiene un buen punto: ¡mira por NULLs!

Creé un procedimiento en SQL dinámico que tiene una instrucción select y el código se ve así:

ALTER PROCEDURE cagroup ( @DataID INT , @days INT , @GName VARCHAR(50) , @T_ID INT , @Act BIT , @Key VARBINARY(16) ) AS BEGIN DECLARE @SQL NVARCHAR(MAX) DECLARE @SchemaName SYSNAME DECLARE @TableName SYSNAME DECLARE @DatabaseName SYSNAME DECLARE @BR CHAR(2) SET @BR = CHAR(13) + CHAR(10) SELECT @SchemaName = Source_Schema , @TableName = Source_Table , @DatabaseName = Source_Database FROM Source WHERE ID = @DataID SET @SQL = ''SELECT '' + @GName + '' AS GrName ,'' + @BR + @T_ID + '' AS To_ID ,'' + @BR + @DataID + '' AS DataSoID ,'' + @BR + @Act + '' AS Active ,'' + @BR + Key + '' AS key'' + @BR + ''R_ID AS S_R_ID'' + @BR + ''FROM'' + @DatabaseName + ''.'' + @SchemaName + ''.'' + @TableName + '' t'' + @BR + ''LEFT OUTER JOIN Gro g ON g.GName = '' + @GName + @BR + ''AND g.Data_ID] ='' + @DataID + @BR + ''t.[I_DATE] > GETDATE() -'' + @days + @BR + ''g.GName IS NULL AND '' + @GName + '' IS NOT NULL AND t.[Act] = 1'' + @BR PRINT (@SQL) END

Cuando estoy ejecutando este procedimiento con esta afirmación:

Exec dbo.cagroup 1,10,''[Gro]'',1,1,NULL

Estoy teniendo el siguiente error.

Msg 245, nivel 16, estado 1, Grupo de grupo de procedimientos, línea 33 La conversión falló al convertir el valor de nvarchar ''SELECT [Gro] AS GName'' a tipo de datos int.

¿Dónde estoy haciendo mal?


Si tiene que crear este tipo de SQL dinámico, es mejor obtener la información de la columna de los metadatos que pasarla.

Select * from Information_Schema.Columns Where Table_name=@TableName

Debes escribir un cursor feo para construir el SQL. Esperar problemas de rendimiento. Hago mucho de esto durante el desarrollo para escribir código para mí, pero no me atrevo a ejecutarlo en producción.