Я пытаюсь динамически строить инструкцию T-SQL на основе таблицы FieldMapping и некоторых бизнес-правил.
Сократите длинную историю, у меня есть функция, которая вернет инструкцию SQL как varchar (max), которую я буду выполнять как EXEC (@Sql)
в моей хранимой процедуре.
Позвольте мне продемонстрировать тестовую таблицу
create procedure [dbo].[sp_TestInsert]
(
@Id int,
@Name varchar(20),
@Surname varchar(20),
@Age int,
@Source varchar(1)
)
as
declare @sql varchar(max)
-- Return SQL statement that depends on business rules
-- i.e. if the @Source = 'i' the returned SQL will be:
-- "update TestTable set Name = @Name, Surname = @Surname, SONbr = @SONbr WHERE Id = @Id"
-- however if the @Source = 'a' the returned SQL will be
-- "update TestTable set Name = @Name, Surname = @Surname, SONbr = @SONbr, Age = @Age WHERE Id = @Id"
-- As you can see, in case of 'i', it will NOT return Age = @Age
set @sql = dbo.func_UpdateOrInsert('TestTable', @Source)
-- When this statement is executed, the error I get is 'scalar @Name does not exist'
exec (@sql)
Я прокомментировал операцию.
Проблема очевидна, я ожидал, что @Id, @Name, @Surname и т.д. автоматически свяжутся с соответствующими именами полей [Id], [Name], [Surname] и т.д. в контексте хранимая процедура... однако, это не так.
Есть ли способ привязать параметры к динамически построенной инструкции SQL?