Динамический SQL - медленная конкатенация строк - PullRequest
0 голосов
/ 11 сентября 2018

Я выполняю динамический 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...