首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL -选择连接文本的记录?

问T-SQL -选择连接文本的记录?
EN

Stack Overflow用户
提问于 2009-04-15 13:32:32
回答 1查看 1.8K关注 0票数 2

我正在尝试调查在SQL2005数据库中删除某些行的时间和原因。我已经开始构建一个触发器,以便在删除行时记录一些信息。

我的触发器在从某个表中删除行时被激活。我将其设置为在发生删除操作时将时间戳记录在另一个日志表中。我还希望记录被删除的数据,但不希望为每个字段和值编写代码。

我知道当数据被删除时,可以(暂时)在SQL Server的“已删除”表中看到它。所以在一次删除之后,我就可以“选择* FROM Deleted”并查看数据。我想把这个表的内容转换成一个大的文本blob,这样我就可以保存到我的记录表中的一个文本字段中。

所以..。简而言之,有没有一种方法可以将一行或多行的记录集转换为单个字符串变量?全部在触发器的SQL命令中吗?如果我可以包含列名,就可以获得加分。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-15 14:05:28

当在触发器中工作时,我会远离运行时间太长的任何东西。这包括一些仅用于确定静态表布局的查询(因为您不想自己编写代码),因此可以构建一个字符串。

我一直都在做这类事情,但主要是使用存储过程参数。我在我使用的模板中包含了大部分内容。

创建此函数,将在引号内很好地显示列或显示NULL:

代码语言:javascript
复制
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

将以下代码粘贴到您的代码中:

代码语言:javascript
复制
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

确保您的表中的每一列都有一行(如果您有更多,只需稍后删除多余的行),如果您想要查看任何日期的详细信息,请使用如上所示的转换。

运行以下查询:

代码语言:javascript
复制
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...“做同样的事情。值,现在就有了一个将构建所需数据的插入,但不会在触发器中浪费太多时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/751708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档