创建SQL事务的文本日志

时间:2016-06-03 18:42:13

标签: sql sql-server logging

我有一个脚本,用于删除多个表中的ID及其关联记录。我正在寻找的是打印所有单个交易的方法。我还没有能够解决这个问题所以我正在运行一个select语句来填充临时表,其中包含将被删除的值。我遇到的问题是我无法想办法显示我的新临时表。

例如,一次删除如下:

DELETE FROM dbo.Attachments WHERE IdeaID IN (SELECT IdeaID FROM #Ideas)

#Ideas是一个包含我想删除的各种ID的表。这些表的每个ID都有0 .. *记录。所以要查看那些记录我可以运行这个选择:

SELECT * INTO #Attachments FROM dbo.Attachments WHERE IdeaID IN (SELECT IdeaID FROM #Ideas)

现在的问题是如何显示?

我试图利用PRINT:

DECLARE @PRINTATTEMPT varchar(max)
SET @PRINTATTEMPT='select * from #Attachments'
EXEC(@PRINTATTEMPT)
PRINT(@PRINTATTEMPT)

不幸的是,所有这些PRINTS都是SQL语句本身,而不是值。

接下来,我尝试使用游标进行迭代和逐行打印变得棘手:

DECLARE @DISPLAYVALUES nvarchar(128)

DECLARE attachmentscur CURSOR FOR
SELECT * FROM #Attachments

OPEN attachmentscur

FETCH NEXT FROM attachmentscur INTO @DISPLAYVALUES;
WHILE @@FETCH_STATUS = 0
BEGIN   
PRINT 'Attachment selected for removal: ' + @DISPLAYVALUES
FETCH NEXT FROM attachmentscur INTO @DISPLAYVALUES;
END

CLOSE attachmentscur;
DEALLOCATE attachmentscur;

不幸的是,随后我会遇到错误" Cursorfetch:在INTO列表中声明的变量数必须与所选列的变量数相匹配。"我想这是试图告诉我它不知道如何遍历表...但我不确定。

再次 - 所以这是有道理的,我有二十几个表,我需要从中删除记录。每个都使用此ID字段,我只想创建一个删除内容的日志(只是一个本地txt文件)。日志无法保存在数据库中,因此无法使用备份表。

1 个答案:

答案 0 :(得分:1)

继续你设置的路线,你的最后一次尝试是好的,但你需要修复你的FETCH INTO状态:你需要为每一列提供一个变量或创建一个与每列对应的记录类型

以完全不同的方式解决问题,您可以使用触发器BEFORE DELETE将所需信息保存到日志表或其他内容中......