Sql server 2005 T-SQL-将记录选择为串联文本?
我试图调查在SQL2005数据库中删除某些行的时间和原因。我已经开始构建一个触发器,在删除一行时记录一些信息 当从某个表中删除行时,我的触发器被激活。我将其设置为在发生删除时在另一个日志记录表中记录时间戳。我还想记录删除的数据,但不想为每个字段和值编写代码 我知道当数据被删除时,可以(暂时)在SQL Server中的“已删除”表中看到它。因此,在删除之后,我可以“选择*从已删除”并查看数据。我想把这个表的内容转换成一个大的文本块,我可以把它保存到日志记录表中的一个文本字段中 所以。。。简单地说,有没有一种方法可以将包含一行或多行的记录集转换为单个字符串变量?触发器中的所有SQL命令?如果我可以包括列名,则可获得额外积分Sql server 2005 T-SQL-将记录选择为串联文本?,sql-server-2005,triggers,concatenation,Sql Server 2005,Triggers,Concatenation,我试图调查在SQL2005数据库中删除某些行的时间和原因。我已经开始构建一个触发器,在删除一行时记录一些信息 当从某个表中删除行时,我的触发器被激活。我将其设置为在发生删除时在另一个日志记录表中记录时间戳。我还想记录删除的数据,但不想为每个字段和值编写代码 我知道当数据被删除时,可以(暂时)在SQL Server中的“已删除”表中看到它。因此,在删除之后,我可以“选择*从已删除”并查看数据。我想把这个表的内容转换成一个大的文本块,我可以把它保存到日志记录表中的一个文本字段中 所以。。。简单地说,
谢谢在使用触发器时,我会远离任何运行时间过长的东西。这包括一些查询,只是为了确定静态表布局(因为您不想自己编写代码),以便构建字符串 我一直在做这类事情,但主要是使用存储过程参数。我使用的模板中包含了大部分内容 创建此函数时,将在引号内很好地显示列或显示空值:
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
确保表中每列有一行(如果有更多行,请稍后删除多余的行),如果希望详细查看任何日期,请使用如上所示的转换
运行此查询:
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
在SQLServerManagementStudio中获取输出(在文本输出模式下),并在列名上单击鼠标左键并拖动一个正方形,然后复制此基于列的选择
返回到您的代码,按住ALT键单击并在insert语句左列的完整“ColumnName…”值上拖动一个正方形,然后粘贴。如果选择了列,它将仅替换该列,并保持左右代码不变。对insert右边的“ColumnName…”值执行相同的操作,现在就有了一个insert,它将生成所需的数据,但不会在触发器中浪费太多时间
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