我會遠離任何會在觸發器中工作時間過長的東西。這包括一些查詢只是爲了確定一個靜態表格佈局(因爲你不想自己編寫代碼),所以你可以建立一個字符串。
我一直在做這種類型的事情,但主要是使用存儲過程參數。我使用的模板中大部分都是這樣。
創建此功能,將很好地顯示列報價或顯示空內:
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(''''[email protected]+'''','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,將在列名方,並複製此基於列的選擇。
返回代碼並按住ALT並單擊 - 在插入語句左側列中的完整「ColumnName ...」值上拖動一個正方形並粘貼。如果您進行了列選擇,它將僅替換列,並保持代碼左右不變。對插入右側的「ColumnName ...」值做同樣的事情,現在你有一個INSERT,它將構建你想要的數據,但不會在觸發器中浪費太多時間。