Я выполняю динамический SQL-запрос, который проходит по всем таблицам в большом дБ (1600 таблиц) и создает запрос, который мне нужно выполнить позже.После создания строки я сохраняю строку и запускаю ее.Однако конкатенация строк очень медленная.Мне нужно добавить намного больше стандартного кода для каждой таблицы, но в приведенном ниже примере я опустил стандартный шаблон для простоты.
Мой вопрос: как я могу ускорить этот процесс построения запросов с помощью конкатенации NVARCHAR?Когда я запускаю этот запрос, он становится значительно медленнее, чем больше конкатенаций текста и параметров.В настоящее время это занимает более 30 минут, но CTE выполняется за 1 секунду.
DECLARE @UpdateColumnsSql NVARCHAR(MAX) = '';
WITH TableColumns AS
(
SELECT
QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) +
'.' + QUOTENAME(t.name) AS TableName
,LOWER(c.name) AS ColumnName
,ty.name AS TypeName
,c.max_length AS ColLength
FROM
sys.tables AS t
INNER JOIN
sys.columns AS c
ON
t.object_id = c.object_id
INNER JOIN
sys.types AS ty
ON
c.system_type_id = ty.system_type_id
WHERE
c.name IN
( 'Company_ID', 'Facility_ID', 'Premises_ID' )
)
SELECT
@UpdateColumnsSql = @UpdateColumnsSql +
'ALTER TABLE ' + TableColumns.TableName +
' ADD [' + TableColumns.ColumnName + '_New] ' + TypeName +
'(' + CONVERT(VARCHAR(4), ColLength) + ')' + ' NULL
SET @sql =
'''' UPDATE T
SET T.[' + TableColumns.ColumnName + '_New] = S.[NewValue]
from ' + TableColumns.TableName + ' T
inner join NewIDList S
on Company = Company_ID
where T.[' + TableColumns.ColumnName + '] = S.OldValue
AND S.[OldColumnName] = ''''''''' + TableColumns.ColumnName + ''''''''' ''''
exec(@sql);
'
FROM
TableColumns;