Используя результат выражения (например, вызов функции) в списке параметров хранимой процедуры?
Я пытаюсь написать хранимую процедуру, чтобы помочь в разработке нашей базы данных, но у меня возникли некоторые проблемы с ее использованием. Например:
DECLARE @pID int;
SET @pID = 1;
EXEC WriteLog 'Component', 'Source', 'Could not find given id: ' + CAST(@pID AS varchar);
Это приводит к ошибке (на SQL Server 2005):
Сообщение 102, Уровень 15, Состояние 1, Строка 4 Неверный синтаксис рядом с '+'.
Может кто-нибудь объяснить мне, почему мой синтаксис неправильный, и правильный способ решить эту проблему?
Ответы
Ответ 1
Вам нужно использовать промежуточную переменную. SQL Server не поддерживает этот вид операции в самом списке параметров, хотя он был в списке TODO в течение нескольких лет! (См. Подключить элемент: использовать скалярные функции в качестве параметров хранимой процедуры)
Грамматика для EXEC
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[;]
В настоящее время документация не отображается в приемлемом формате для value
, но, похоже, это только "простые" выражения, такие как литеральные значения или @@
префиксные системные функции (например, @@IDENTITY
). Другие системные функции, такие как SCOPE_IDENTITY()
, не разрешены (даже те, которые не требуют скобок, таких как CURRENT_TIMESTAMP
, недопустимы).
Итак, пока вам нужно использовать синтаксис, например, ниже
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
Ответ 2
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
Как указывал Мартин, следующее относится только к столбцам, а не к переменным.
Обратите внимание, что я внесла изменения в ваш бросок varchar(10)
это позволит целые числа больше 1 цифры. varchar
допускает только 1 символ
Ответ 3
Вы не можете выполнять операции с параметрами хранимой процедуры. Вы должны назначить это значение для другой переменной, а затем передать ее вашему 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
Ответ 4
Возможно, что-то вроде этого?
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;
Ответ 5
Попробуйте это вместо...
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;
Ответ 6
DECLARE @id int
SET @id = 10
SELECT LTRIM (RTRIM (STR (@id))) AS stringValue
Ответ 7
Используйте этот код для печати сообщения об ошибке Sql Server:
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO
Вот набор результатов.
Copy
-----------
(0 row(s) affected)
ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage
----------- ------------- ----------- --------------- ---------- ----------------------------------
8134 16 1 NULL 4 Divide by zero error encountered.
(1 row(s) affected)