Sql-Server-2008-R2

xp_cmdshell 在事務中

  • May 6, 2015

我需要在事務的某個文件夾中執行多個腳本,如果有任何錯誤則回滾。在這一點上,我只是想讓回滾工作沒有嘗試擷取。

目前,當我執行腳本時,它會遞歸地獲取正確的 sql 文件列表,但如果出現錯誤則不會回滾更改。如果有10個文件,3個完成但4號有錯誤,前3個文件不回滾。

這是我的腳本:

BEGIN TRANSACTION

CREATE TABLE ##SQLFiles ( SQLFileName VARCHAR(2000))
GO

DECLARE @folderPath VARCHAR(100) = 'folder\path' 
DECLARE @cmd VARCHAR(8000) = 'dir /b /s "' + @folderPath + '\*.sql"'

INSERT INTO ##SQLFiles
EXECUTE master.dbo.xp_cmdshell @cmd
GO 

DECLARE cFiles CURSOR LOCAL FOR
   SELECT DISTINCT
       [SQLFileName]
   FROM ##SQLFiles
   WHERE [SQLFileName] IS NOT NULL AND
         [SQLFileName] != 'NULL'
   ORDER BY [SQLFileName]

DECLARE @folderPath         VARCHAR(100) = 'folder\path' 
DECLARE @vFileName          VARCHAR(200)
DECLARE @vSQLStmt           VARCHAR(4000)

SELECT * FROM ##SQLFiles

OPEN cFiles
FETCH NEXT FROM cFiles INTO @vFileName
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @vSQLStmt = 'master.dbo.xp_cmdshell ''osql -S ServerName -U UserName -P "password" -d dbname -i "' + @folderPath + @vFileName + '"'''
   PRINT @vSQLStmt
   EXECUTE (@vSQLStmt)

   FETCH NEXT FROM cFiles INTO @vFileName
END

CLOSE cFiles
DEALLOCATE cFiles
GO

DROP TABLE ##SQLFiles
GO

ROLLBACK TRANSACTION

有沒有辦法讓文件所做的更改被回滾?

不,絕對不可能。每個 sqlcmd 呼叫都是不同的會話,事務不能跨越會話。

您在呼叫 sqlcmd 的腳本上使用事務是完全沒用的,它與正在執行的腳本無關。

引用自:https://dba.stackexchange.com/questions/100781