valores - procedimientos almacenados sql ejemplos
¿Utiliza el resultado de una expresión(por ejemplo, llamada de función) en una lista de parámetros de procedimiento almacenado? (6)
Intento escribir un procedimiento almacenado para ayudar con el desarrollo de nuestra base de datos, pero estoy teniendo problemas para usarlo. Por ejemplo:
DECLARE @pID int;
SET @pID = 1;
EXEC WriteLog ''Component'', ''Source'', ''Could not find given id: '' + CAST(@pID AS varchar);
Esto produce el error (en SQL Server 2005)
Msg 102, nivel 15, estado 1, línea 4 Sintaxis incorrecta cerca de ''+''.
¿Puede alguien explicarme por qué mi sintaxis es incorrecta y la forma correcta de resolver este problema?
No puede hacer operaciones en los parámetros de un procedimiento almacenado. Debe asignar ese valor a otra variable y luego pasarlo a su SP.
DECLARE @pID int, @nameId VARCHAR(100);
SET @pID = 1;
SET @nameId = ''Could not find given id: '' + CAST(@pID AS varchar);
EXEC WriteLog ''Component'', ''Source'', @nameId
Pruebe esto en su lugar ...
DECLARE @pID int;
SET @pID = 1;
DECLARE @message varchar(255);
SET @message = ''Could not find given id: '' + CAST(@pID AS varchar)
EXEC WriteLog ''Component'', ''Source'', @message;
Tal vez algo como esto?
DECLARE @pID int;
SET @pID = 1;
DECLARE @Message NVARCHAR(50);
SET @Message = ''Could not find given id: '' + CAST(@pID AS varchar)
EXEC WriteLog ''Component'', ''Source'', @Message;
DECLARE @pID int;
declare @IdAsString varchar(100)
SET @pID = 1;
Select @IdAsString =''Could not find given id: '' + Cast(@pId as varchar(10))
EXEC WriteLog ''Component'', ''Source'', @IdAsString
Como lo señaló Martin, lo siguiente solo se aplica a columnas no variables.
Tenga en cuenta que he modificado su
varchar(10)
avarchar(10)
esto permitirá enteros de más de 1 dígito.varchar
solo permitirá 1 caracter
DECLARAR @id int
SET @id = 10
SELECT LTRIM (RTRIM (STR (@id))) AS stringValue
Necesitas usar una variable intermedia. SQL Server no es compatible con este tipo de operación en la lista de parámetros, aunque ha estado en la lista TODO durante algunos años. (Consulte Conectar elemento: Usar funciones escalares como parámetros de procedimiento almacenados )
La gramática para EXEC
es
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[;]
La documentación actualmente no es tan clara en un formato aceptable de value
pero parece ser solo expresiones "simples" como valores literales o funciones de sistema con prefijo @@
(como @@IDENTITY
). No se permiten otras funciones del sistema, como SCOPE_IDENTITY()
(incluso aquellas que no requieren paréntesis, como CURRENT_TIMESTAMP
, no están permitidas).
Entonces, por el momento, necesita usar sintaxis como la siguiente
DECLARE @pID INT;
SET @pID = 1;
/*If 2008+ for previous versions this needs to be two separate statements*/
DECLARE @string VARCHAR(50) = ''Could not find given id: '' + CAST(@pID AS VARCHAR(11))
EXEC WriteLog
''Component'',
''Source'',
@string