SQL Server Formatmessage函数无法使用过程中的变量

问题描述 投票:1回答:1

数据设置来解释我的问题

    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' 

我做得不好?

sql sql-server stored-procedures
1个回答
1
投票

如果你低于2017年(或者是2016年?),你不能将NVARCHAR(MAX)FORMATMESSAGE一起使用,它是一个实际用于报告错误的系统函数,因此它有其局限性。你可以使用NVARCHAR(4000)(最大金额)。

results on SQL Server 2012

© www.soinside.com 2019 - 2024. All rights reserved.