SQL. Как передать значение поля таблицы в переменную
Пишу на T-Sql триггер, срабатывающий на добавление в таблицу Table1 новой строки. Каждый столбец этой строки содержит имя другой таблицы: Table2, Table3 и т.д. В эти самые таблицы (Table2, Table3 и т.д.) мне нужно вставить новые строки, значения которых вычисляются в триггере. Проблема следующая: у меня не получается заполнить динамически значение переменной, которая должна содержать в себе имя Table2 или Table3. Вместо этого переменная @TableName содержит в себе следующее: 'select column1 from Table1 where num_string = sn', где column1 - значение текстовой переменной, sn - значение числовой переменной. Дальше по коду триггера мне нужно вставить строки в таблицу Table2 или Table3 в зависимости от того, какое значение я выбрал динамически. Но в итоге падает ошибка о неправильном синтаксисе возле слова insert, ведь когда я пытаюсь динамически выполнить следующую переменную на заполнение, то в ней получается текст 'insert into select colomn1...' вместо 'insert into Table2...'
Написано все таким образом:
Set @tablename = 'select '+@num_col+' from Table1 where num_string = '+cast(@num_string as nvarchar(99))+''
exec sp_executesql @tablename
Set @insert = 'insert into '+@tablename+' values(' +@a+','+@b')'
exec sp_executesql @insert
Что я делаю не так? Спасибо за помощь
Ответы (1 шт):
Имя таблицы должно быть в отдельной переменной.
В параметре для sp_executesql задаём имя выходного параметра.
Подробности в справке по sp_executesql.
declare @tablename nvarchar(500)
declare @tableIN nvarchar(500)
declare @select nvarchar(500)
declare @param nvarchar(500)
set @tableIN = 'Table1' -- имя таблицы, в которой ищем
set @param = N'@tableOUT nvarchar(200) OUTPUT' -- имя выходного параметра
set @select = 'select @tableOUT ='+@num_col+' from '+@tableIN+' where num_string = '+cast(@num_string as nvarchar(99))+''
exec sp_executesql @select, @param, @tableOUT = @tablename output
-- в @tablename находится имя другой таблицы
set @insert = 'insert into '+@tablename+' values('+@a+','+@b+')'
exec sp_executesql @insert