2012-05-28 2 views
1

Я использую триггеры для аудита изменений таблицы. Сейчас я захватить отдельные изменения столбцов в следующем:SQL - Конкатенация всех столбцов из любой таблицы

DECLARE @statement VARCHAR(MAX) 
SELECT @statement = 
'Col1: ' + CAST(ISNULL(Col1, '') AS VARCHAR) + ', Col2: ' + CAST(ISNULL(Col2, '') AS VARCHAR) + ', Col3: ' + CAST(ISNULL(Col3, '') AS VARCHAR) 
FROM INSERTED; 

Проблема заключается в том, мне нужно настроить имена столбцов для каждой таблицы/триггера, который я хочу провести аудит против. Есть ли способ, которым я могу построить @statement, независимо от таблицы, используя более общий подход?

веселит Дэвид

+0

Возможный дубликат [Как создать общую SQL Server хранимую процедуру для выполнения вставок в таблицу аудита на основе вставленных и удаленных в триггерах] (http://stackoverflow.com/questions/8873335/how-to-create-generic- sql-server-stored-procedure-to-perform-inserts-in-audit) – GSerg

+0

У всех типов данных столбцов есть подходящие преобразования из '' '' для использования в 'ISNULL()', например вы не используете 'VarBinary'? Является ли потеря 'NULL' проблемой? – HABO

+1

Почему бы не иметь отдельную таблицу аудита для каждой таблицы в базе данных? Таким образом, структура аудита может имитировать исходную структуру таблицы. –

ответ

1

то, что вам нужно сделать, это построить таблицу памяти, используя следующий запрос, а затем цикл через тот же произвести оператор SQL вы хотите

выберите column_name из INFORMATION_SCHEMA.COLUMNS где table_name like 'tName' order by ordinal_position

Однако я не уверен, что это было бы правильным решением для AUDIT. Как ты собираешься вернуть его позже. Скажите, что в одном из ваших выпусков вам выпадет столб, что произойдет? как вы узнаете, в какой колонке были указаны данные.

+0

спасибо, я должен был бы построить его динамически, используя это. FYI - я использую здесь аудит слова свободно, мы действительно просто ищем простой обзор того, что изменилось. – downatone