1
我想知道如何使用OUTPUT
來編寫T-SQL DELETE
語句來爲您已刪除的行添加INSERT
語句(作爲將來的回滾計劃)而不是簡單地輸出被刪除的行。SQL Server:帶回滾INSERT語句的DELETE語句到文件中
通用示例或代碼片段將被投票。
也包括聲明作爲一個整體將這些INSERT
語句導出到文件(例如使用BCP)將被接受爲答案。
服務器是SQL Server的2008R2
謝謝
我想知道如何使用OUTPUT
來編寫T-SQL DELETE
語句來爲您已刪除的行添加INSERT
語句(作爲將來的回滾計劃)而不是簡單地輸出被刪除的行。SQL Server:帶回滾INSERT語句的DELETE語句到文件中
通用示例或代碼片段將被投票。
也包括聲明作爲一個整體將這些INSERT
語句導出到文件(例如使用BCP)將被接受爲答案。
服務器是SQL Server的2008R2
謝謝
如果我理解你的問題,你想要的是創建一個INSERT語句,將撤消刪除文件。如果是這樣一個做到這一點,應該工作方式是這樣的:
-- set up some test data
DECLARE @table1 TABLE (id INT, name VARCHAR(32))
INSERT INTO @table1 VALUES (1, 'Fred'),(2, 'Tom'),(3, 'Sally'),(4, 'Alice')
-- drop and create a temporary table to hold the statements to output
IF OBJECT_ID('TempOutputTable', 'U') IS NOT NULL
DROP TABLE TempOutputTable
CREATE TABLE TempOutputTable (SqlStatement VARCHAR(MAX))
-- delete a couple of rows from @table1
DELETE FROM @table1
OUTPUT 'INSERT table1 (id, value) VALUES (' + CAST(deleted.id AS VARCHAR(10)) + ', ''' + deleted.name + ''')' AS SqlStatement
INTO TempOutputTable
WHERE id = 4 OR id = 2
-- export using bcp
DECLARE @SqlCommand sysname
SELECT @SqlCommand = 'bcp "select * from test.dbo.TempOutputTable" queryout D:\mytest.txt -c -T'
EXEC xp_cmdshell @SqlCommand, NO_OUTPUT
-- remove the temporary table
DROP TABLE TempOutputTable
後運行該文件D:\mytest.txt
將包含此:
INSERT table1 (id, value) VALUES (2, 'Tom')
INSERT table1 (id, value) VALUES (4, 'Alice')
這假定xp_cmdshell
啓用(以能夠運行BCP ),當然你必須根據你的需要調整插入語句。
謝謝!如果沒有臨時表(即OUPUT INTO @tableVar),並且無需知道表結構(即在您的示例中,(id,value)和其餘部分可以是自動生成的表),就可以使INSERT語句爲泛型,那麼任何機會都可以嗎? – user1589188
@ user1589188我認爲有可能使聲明是通用的,但我也相信臨時表是必要的,因爲您需要一種方法來在刪除會話和從外部運行的bcp會話之間持久保存數據。今天晚些時候我可以進一步研究。 – jpw
是的,通用的允許我在多個表格中使用它,而無需調整。不過,你的答案已經很聰明瞭。 – user1589188