Настройка данных, чтобы объяснить мою проблему
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

Кажется, 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'
Что я не правильно делаю?