Я использую очень большой сценарий для извлечения из нашей базы данных, который объединяет множество различных наборов данных, чтобы представить данные таким образом, чтобы их можно было своевременно обрабатывать. Я вставляю много данных во множество временных таблицы перед выполнением основного скрипта. Он работает асинхронно, без одновременного запуска других сценариев. Это контролируемое выполнение во время пакетного запуска, и оно наиболее определенно само по себе во время выполнения. Запуск занимает всего 24 секунды, поэтому мы не имеем дело с перезапуском БД, который является единственным вариантом, который я видел в некоторых Google.
Чтобы убедиться, что в случае сбоя я могу быть уверен, что все чисто, я использовал глобальные временные таблицы, управляемые только одним и тем же сценарием.
Ошибка, которую получают некоторые пользователи:
Invalid object name '##SUM_IRT'
Это единственное место в любых сценариях, где упоминается эта временная таблица, последние несколько зарегистрированных пользовательских ошибок были этой же таблицей, и это только одна временная таблица из 20 ~ в сценарии, которая выдает ошибку ниже. Иногда временная таблица меняется на другую случайную. Ниже приведен пример использования последнего для выдачи ошибки.
IF OBJECT_ID('tempdb..##SUM_IRT') IS NOT NULL
DROP TABLE ##SUM_IRT
…
CREATE TABLE ##SUM_IRT
(
ident_id INT NOT NULL PRIMARY KEY,
ident_val FLOAT NOT NULL
)
…
INSERT INTO ##SUM_IRT
SELECT rs.ident_id, SUM(rs.ident_val) AS ident_val
FROM rs_ident rs WHERE rs_ident_category IN( 'A', 'B', 'C' )
AND (@ExtractDate BETWEEN rs_start_date AND rs_end_date) AND rs_record_status = 'I'
GROUP BY rs.ident_id
…
SELECT WHEN rst.ident_val IS NULL OR rst.ident_val = 0 THEN
''
ELSE
CAST(CONVERT(NUMERIC(11,2), ISNULL(rst.rst_ident_val, 0)) AS VARCHAR(20)) -- Redudant ISNULL don't ask don't tell.
END AS [ident_val_string]
-- Main script join
LEFT OUTER JOIN ##SUM_IRT rst ON rst.ident_id = po.ident_id
…
IF OBJECT_ID('tempdb..##SUM_IRT') IS NOT NULL
DROP TABLE ##SUM_IRT