Функция SQL Server Formatmessage не может работать с переменной в процедуре

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

    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

Функция SQL Server Formatmessage не может работать с переменной в процедуре

Кажется, 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' 

Что я делаю не так?

Вы пытались объявить @SqlPartial как nvarchar (xxx), а не nvarchar (max) ???? кажется, что FORMATMESSAGE может обрабатывать максимум 2048 символов, и, возможно, у него есть проблемы с nvarchar (max)? см.: docs.microsoft.com/en-us/sql/t-sql/functions/…

Antonio 10.04.2019 14:03

не могу воспроизвести вашу ошибку

StepUp 10.04.2019 14:03

@Antonio Антонио - я только что попробовал, сначала с 2048, а затем с 250, не повезло

Gro 10.04.2019 14:05

@StepUp - означает ли это, что вы можете получить результат из первой версии процедуры? Если да, то какую версию SQL-сервера вы используете? У меня Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64) 15 августа 2017 г. 10:23:29 Copyright (c) Microsoft Corporation Enterprise Edition (64-разрядная версия) в Windows NT 6.2 <X64> (сборка 9200 : ) (Гипервизор)

Gro 10.04.2019 14:08

Моя версия Microsoft SQL Server 2017 (RTM-CU14) (KB4484710) - 14.0.3076.1 (X64) Mar 12 2019 19:29:19 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

StepUp 10.04.2019 14:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
1 760
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

results on SQL Server 2012

Действительно, изменение nvarchar(max) на nvarchar(4000) сработало. Но тогда его пришлось изменить как для '@sqlPartial', так и для '@sqlTmp'. Простое изменение его на «@sqlPartial», которое было предоставлено FORMATMESSAGE, не работает.

Gro 10.04.2019 14:24

Это точно такое же решение, которое я вам дал, изменить nvarchar(max) на что-то другое... оно работает только с nvarchar(4000)?

Antonio 10.04.2019 15:44

Другие вопросы по теме