У меня есть курсор, который перебирает каждую базовую таблицу в базе данных.Он вставляет записи в другую таблицу, выполняя фрагмент динамического SQL, но на данный момент выполнение занимает более 20 минут.
DECLARE TableCursor CURSOR FOR
SELECT TABLE_NAME
FROM <DB>.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
WHILE(@@FETCH_STATUS = 0)
BEGIN
#Dynamic SQL Query to insert data into each table in cursor#
Я провел некоторое исследование и обнаружил, что с помощью CTE с выражением UNIONбудет намного быстрее, но я не уверен, как выполнить преобразование, например, как циклически проходить по каждой таблице в CTE.
Любая помощь очень ценится.
РЕДАКТИРОВАТЬ : это пример динамического SQL:
SELECT @SQL = 'WITH CTE_DATES(DATE_VAL) AS (
SELECT DISTINCT DATE_VAL
FROM DATE_EVERY_DAY
WHERE DATE_VAL <= GETDATE()
)
INSERT INTO COUNT_RECORDS_TABLE (DATE_VAL, TABLE_NAME, NUM_RECS_IMPORTED)
SELECT cd.DATE_VAL, ''' + @TableName + ''' AS TABLE_NAME, COUNT(CAST(tn.IMPORT_DATE AS DATE)) AS NUM_RECS_IMPORTED
FROM CTE_DATES AS cd LEFT JOIN ' + @TableName + ' AS tn
ON CAST(tn.IMPORT_DATE AS DATE) = cd.DATE_VAL
GROUP BY cd.DATE_VAL'