Функция форматирования сообщений SQL Server не может работать с переменной внутри процедуры - PullRequest
1 голос
/ 10 апреля 2019

Настройка данных, чтобы объяснить мою проблему

    create table dbo.tbl_test1(
        test1_id    int,
        val         varchar(50)
    );

    create table dbo.tbl_test2(
        test2_id    int,
        val         varchar(50)
    );

    insert into dbo.tbl_test1 values(1, 'Hola');    
    insert into dbo.tbl_test2 values(1, 'Hi');   

Следующая процедура при вызове выдает ошибку, как показано на снимке экрана

create procedure [dbo].[test_procedure] 
   @tbl_nm varchar(50), 
   @col_nm varchar(50), 
   @val varchar(max)
as
begin
    declare @sqlPartial as nvarchar(max),
            @sqlTmp as nvarchar(max),
            @result as int

    SET @sqlPartial = 'select @res=%s from %s where val=''%s'''
    /* @sqlPartial as argument is source of error */
    SELECT @sqlTmp=FORMATMESSAGE(@sqlPartial, @col_nm, @tbl_nm, @val)
    print @sqlTmp

    EXECUTE sp_executesql @sqlTmp, N'@res int OUTPUT', @res=@result OUTPUT

    select @result
end
go

enter image description here

Кажется, FORMATMESSAGE не может работать с переменной @sqlPartial. Как только я заменяю @sqlPartial на строку из @sqlPartial, она работает хорошо, как в следующей модифицированной процедуре

alter procedure [dbo].[test_procedure] 
   @tbl_nm varchar(50), 
   @col_nm varchar(50), 
   @val varchar(max)
as
begin
    declare @sqlTmp as nvarchar(max),
            @result as int
    /* @sqlPartial replaced with content works */
    SELECT @sqlTmp = FORMATMESSAGE('select @res=%s from %s where val=''%s''', @col_nm, @tbl_nm, @val)
    print @sqlTmp

    EXECUTE sp_executesql @sqlTmp, N'@res int OUTPUT', @res=@result OUTPUT

    select @result
end
go

Для выполнения этой процедуры используйте

exec dbo.test_procedure @tbl_nm='tbl_test1', @col_nm='test1_id', @val='Hola' 

Что я не правильно делаю?

1 Ответ

1 голос
/ 10 апреля 2019

Если вы ниже 2017 (или 2016?), Вы не можете использовать NVARCHAR(MAX) с FORMATMESSAGE, это системная функция, фактически используемая для сообщения об ошибках, и поэтому у нее есть свои ограничения. Вы можете использовать NVARCHAR(4000) (максимальная сумма).

results on SQL Server 2012

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...