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.