Я бы держался подальше от всего, что работало бы слишком долго при работе в триггере. Это включает в себя некоторый запрос только для определения статического макета таблицы (потому что вы не хотите писать код самостоятельно), чтобы вы могли построить строку.
Я все время так делаю, но в основном с параметрами хранимых процедур. У меня есть большая часть этого в шаблоне, который я использую.
создайте эту функцию, будет красиво отображать столбец в кавычках или показывать NULL:
CREATE FUNCTION [dbo].[QuoteNull]
(
@InputStr varchar(8000) --value to pad
)
RETURNS
varchar(8000)
AS
/*
TEST WITH:
----------
PRINT ' dbo.QuoteNull(null) ->'+dbo.QuoteNull(null)+'<-'
PRINT ' dbo.QuoteNull(''apple'') ->'+dbo.QuoteNull('apple')+'<-'
PRINT ' dbo.QuoteNull(123) ->'+dbo.QuoteNull(123)+'<-'
PRINT ' dbo.QuoteNull(GETDATE()) ->'+dbo.QuoteNull(GETDATE())+'<-'
PRINT ' dbo.QuoteNull(GETDATE()) ->'+dbo.QuoteNull(CONVERT(varchar(23),GETDATE(),121))+'<-'
*/
BEGIN
RETURN COALESCE(''''+@InputStr+'''','null')
END
GO
вставьте это в свой код:
INSERT INTO YourLogTable
(xxx,yyy,zzz,ColumnTextValue)
SELECT
xxx,yyy,zzz,'values:'
+' '+RTRIM('ColumnNameInt ')+'='+dbo.QuoteNull( ColumnNameInt )
+', '+RTRIM('ColumnNameVarchar ')+'='+dbo.QuoteNull( ColumnNameVarchar )
+', '+RTRIM('ColumnNameChar ')+'='+dbo.QuoteNull( ColumnNameChar )
+', '+RTRIM('ColumnNameDate ')+'='+dbo.QuoteNull(CONVERT(varchar(23),ColumnNameDate ,121))
FROM DELETED
убедитесь, что у вас есть одна строка для каждого столбца в вашей таблице (если у вас есть больше, просто удалите дополнительные столбцы позже), если вы хотите увидеть какие-либо даты в деталях, используйте преобразование, как показано выше.
выполнить этот запрос:
select sc.name
FROM syscolumns sc INNER JOIN sysobjects so ON sc.id = so.id
where UPPER(so.name)=UPPER('YourTableName') order by sc.colorder desc
взять вывод в SQL Server Management Studio (в режиме вывода текста) и выполнить ALT-LEFT_Click-Drag для перетаскивания квадрата над именами столбцов и скопировать этот выбор на основе столбцов.
Вернитесь к своему коду и ALT-Click-Drag перетащите квадрат над полными значениями «ColumnName ...» в левом столбце оператора вставки и вставьте. Если вы сделали выбор столбца, он заменит только столбец и оставит код без изменений слева и справа. Сделайте то же самое для значений «ColumnName ...» в правой части вставки, и теперь у вас есть INSERT, который будет создавать нужные данные, но не будет тратить слишком много времени на триггер.