2009-04-15 77 views
2

我想調查什麼時候&爲什麼某些行在SQL 2005數據庫中被刪除。當一行被刪除時,我已經開始構建觸發器來記錄一些信息。T-SQL - 選擇記錄到連接的文本?

從某個表中刪除行時激活了我的觸發器。我將它設置爲在發生刪除時在另一個日誌記錄表中記錄時間戳記。我還想記錄已刪除的數據,但不希望爲每個字段和值編寫代碼。

我知道何時刪除數據,可以在SQL Server的「已刪除」表中看到(暫時)。所以在刪除後,我可以「選擇*從已刪除」並查看數據。我想採取這張表的內容,並把它變成一個大的文本塊,我可以保存到我的日誌表中的TEXT字段。

因此......簡單來說,是否有一種方法可以將一行或多行的記錄集轉換爲單個字符串變量?所有在我的觸發器中的SQL命令?如果我可以包含列名,則爲獎勵積分。

謝謝

回答

1

我會遠離任何會在觸發器中工作時間過長的東西。這包括一些查詢只是爲了確定一個靜態表格佈局(因爲你不想自己編寫代碼),所以你可以建立一個字符串。

我一直在做這種類型的事情,但主要是使用存儲過程參數。我使用的模板中大部分都是這樣。

創建此功能,將很好地顯示列報價或顯示空內:

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,它將構建你想要的數據,但不會在觸發器中浪費太多時間。