我正在尝试调查在SQL2005数据库中删除某些行的时间和原因。我已经开始构建一个触发器,以便在删除行时记录一些信息。
我的触发器在从某个表中删除行时被激活。我将其设置为在发生删除操作时将时间戳记录在另一个日志表中。我还希望记录被删除的数据,但不希望为每个字段和值编写代码。
我知道当数据被删除时,可以(暂时)在SQL Server的“已删除”表中看到它。所以在一次删除之后,我就可以“选择* FROM Deleted”并查看数据。我想把这个表的内容转换成一个大的文本blob,这样我就可以保存到我的记录表中的一个文本字段中。
所以..。简而言之,有没有一种方法可以将一行或多行的记录集转换为单个字符串变量?全部在触发器的SQL命令中吗?如果我可以包含列名,就可以获得加分。
谢谢
发布于 2009-04-15 14:05:28
当在触发器中工作时,我会远离运行时间太长的任何东西。这包括一些仅用于确定静态表布局的查询(因为您不想自己编写代码),因此可以构建一个字符串。
我一直都在做这类事情,但主要是使用存储过程参数。我在我使用的模板中包含了大部分内容。
创建此函数,将在引号内很好地显示列或显示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并拖动一个正方形,然后复制此基于列的选择。
返回到您的代码,按住Alt键并单击并在完整的"ColumnName...“上拖出一个方块。值并粘贴到insert语句的左列中。如果您选择了列,它将仅替换该列,并保持代码左右不变。对"ColumnName...“做同样的事情。值,现在就有了一个将构建所需数据的插入,但不会在触发器中浪费太多时间。
https://stackoverflow.com/questions/751708
复制相似问题