Обновление с динамическими таблицами - PullRequest
0 голосов
/ 05 июня 2019

Я должен написать обновление, используя динамический sql, потому что я знаю только имя столбца, который я хочу обновить, и имена столбцов, которые я буду использовать для объединения таблиц в моем обновлении.Но я не знаю номеров таблиц и имен.Имена таблиц я получу в параметре моей процедуры следующим образом:

declare @Tables = N'Customer,Employee,Owner'

Поэтому я хочу, чтобы обновление было таким:

update t 
    set [Status] = 100
from 
   TemporaryTable t 
   left join Customer t1 on t1.RecordId = t.RecordId 
   left join Employee t2 on t2.RecordId = t.RecordId 
   left join Owner t3 on t3.RecordId =t.RecordId

   where 
      t1.RecordId is null 
      and t2.RecordId is NULL
      and t3.RecordId is null 

Я знаю, что в каждой таблице будет столбец RecordId.и хочу присоединить эти таблицы к моей временной таблице в этом столбце, но я не знаю имен и номеров таблиц.Например, у меня будет одна, две или десять таблиц с разными именами.Я знаю, что имена этих таблиц будут сохраняться в параметре @Tables таким образом:

 @Tables = N'Customer,Employee,Owner'

Можно ли написать это обновление динамически?

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Кажется, это подойдет вашим потребностям, хотя я не до конца понимаю, что вы пытаетесь сделать.Здесь мы строим окончательный SQL из двух частей (@s и @where), а затем объединяем в окончательный SQL в конце.

declare @Tables varchar(100) = N'Customer,Employee,Owner'
declare @tablenames table (tablename nvarchar(100))

insert @tablenames (tablename)
select value
  from string_split(@Tables, ',');

declare @where varchar(max) = ''
declare @s varchar(max) = '
update t
   set [Status] = 100
  from TemporaryTable t'

select @s += '
  left join ' + tablename + ' on ' + tablename + '.RecordId = t.RecordId'
     , @where += case when @where = '' then '' else ' and ' end + tablename + '.RecordId is null
     '
  from @tablenames

print @s + char(13) + ' where ' + @where
exec( @s + char(13) + ' where ' + @where)
0 голосов
/ 05 июня 2019

Это ответ, который помогает ... написать обновление с использованием динамического sql ... и показывает только, как сгенерировать динамический оператор. Он основан на разделении строк. Из SQL Server 2016+ вы можете использовать STRING_SPLIT() (потому что здесь порядок подстрок не важен). Для предыдущих версий вам нужно найти функцию разделения строк.

T-SQL:

DECLARE @Tables nvarchar(max) = N'Customer,Employee,Owner'
DECLARE @join nvarchar(max) = N''
DECLARE @where nvarchar(max) = N''
DECLARE @stm nvarchar(max) = N''

SELECT 
   @join = @join + CONCAT(
      N' LEFT JOIN ',
      QUOTENAME(s.[value]),
      N' t',
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
      N' ON t',
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
      N'.RecordId = t.RecordId'
   ),
   @where = @where + CONCAT(
      N' AND t',
      ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
      N'.RecordId is NULL'
   )
FROM STRING_SPLIT(@Tables, N',') s
SET @stm = CONCAT(
   N'UPDATE t SET [Status] = 100 ',
   N'FROM TemporaryTable t',
   @join,
   N' WHERE ',
   STUFF(@where, 1, 5, N'')
)

PRINT @stm
EXEC sp_executesql @stm

Примечания:

Одно замечание, которое я считаю важным - рассмотреть возможность передачи имен таблиц с использованием типа табличного значения для параметра, а не в виде текста через запятую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...