我有一个脚本,用于删除多个表中的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文件)。日志无法保存在数据库中,因此无法使用备份表。
答案 0 :(得分:1)
继续你设置的路线,你的最后一次尝试是好的,但你需要修复你的FETCH INTO状态:你需要为每一列提供一个变量或创建一个与每列对应的记录类型
以完全不同的方式解决问题,您可以使用触发器BEFORE DELETE将所需信息保存到日志表或其他内容中......