Использование результата выражения (например, вызова функции) в списке параметров хранимой процедуры? - PullRequest
16 голосов
/ 08 февраля 2011

Я пытаюсь написать хранимую процедуру, чтобы помочь в разработке нашей базы данных, но у меня возникли некоторые проблемы с ее использованием.Например:

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 Неверный синтаксис рядом с '+'.

Может кто-нибудь объяснить мне, почему мой синтаксис неправильный, и правильный способ решить эту проблему?

Ответы [ 7 ]

18 голосов
/ 08 февраля 2011

Вам необходимо использовать промежуточную переменную.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 голосов
/ 08 февраля 2011
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 символ

1 голос
/ 08 февраля 2011

Вы не можете выполнять операции с параметрами хранимой процедуры. Вам следует присвоить это значение другой переменной и затем передать его вашему 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
0 голосов
/ 11 июля 2019

Используйте этот код для печати сообщения об ошибке сервера Sql:

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)
0 голосов
/ 28 февраля 2013

ОБЪЯВИТЬ @id int

SET @id = 10

ВЫБРАТЬ LTRIM (RTRIM (STR (@id))) в качестве stringValue

0 голосов
/ 08 февраля 2011

Попробуйте вместо этого ...

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;
0 голосов
/ 08 февраля 2011

Может, как-то так?

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...