Sql-Server-2008-R2
xp_cmdshell 在事務中
我需要在事務的某個文件夾中執行多個腳本,如果有任何錯誤則回滾。在這一點上,我只是想讓回滾工作沒有嘗試擷取。
目前,當我執行腳本時,它會遞歸地獲取正確的 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 的腳本上使用事務是完全沒用的,它與正在執行的腳本無關。