Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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)