我們如何在一個事務中運行多個 sql 腳本,其中每個腳本可能定義了相同的變數?
檔案 1:
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '1apples' convert(varchar(28), getdate(),121)
select @query = 'select name into ' quotename(@tableName) ' from sys.objects'
print @query
exec (@query)
go
檔案2:
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '2apples' convert(varchar(28), getdate(),121)
select @query = 'select name into ' quotename(@tableName) ' from sys.objects'
print @query
exec (@query)
go
我正在 PowerShell 中執行這樣的檔案:
try {
$files = Get-ChildItem -Path $SqlFilesDirectory -File -Filter *.sql
$filesSorted = $files |Sort-Object -Property Name
$filesconcatenated = @(
$files |Get-Content -Raw
) -join [Environment]::NewLine
$filesconcatenated = 'SET XACT_ABORT ON ' $filesconcatenated ' SET XACT_ABORT OFF ' [Environment]::NewLine
$cmd = New-Object System.Data.SqlClient.SqlCommand ($filesconcatenated), $conn
$cmd.Transaction = $tran
[void]$cmd.ExecuteNonQuery()
$tran.Commit()
}
catch {
$tran.Rollback()
Write-Host "Record not Inserted ->"
$_.exception.message
}
finally {
$conn.Close()
}
我收到以下例外:
使用“0”引數呼叫“ExecuteNonQuery”的例外:“關鍵字‘declare’附近的語法不正確。變數名‘@tableName’已經被宣告。變數名在查詢批處理或存盤程序中必須是唯一的。變數名 '@tableName' 已經宣告。變數名在查詢批處理或存盤程序中必須是唯一的。關鍵字 'SET' 附近的語法不正確。
我們如何在一個事務中運行多個 SQL 腳本,其中每個腳本可能定義了相同的變數?
這是它嘗試運行的完整腳本:
SET XACT_ABORT ON
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '1apples' convert(varchar(28), getdate(),121)
select @query = 'select name into ' quotename(@tableName) ' from sys.objects'
print @query
exec (@query)
go
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '2apples' convert(varchar(28), getdate(),121)
select @query = 'select name into ' quotename(@tableName) ' from sys.objects'
print @query
exec (@query)
go
declare @tableName varchar(28), @query nvarchar(1000)
set @tableName = '3apples' convert(varchar(28), getdate(),121)
select @query = 'select name into ' quotename(@tableName) ' from sys.objects'
print @query
exec (@query)
go
SET XACT_ABORT OFF
uj5u.com熱心網友回復:
您不能在一個批次中兩次使用相同的變數
因此,通過回圈陣列,將它們作為單獨的命令執行
$connString = "Server=tcp:$ServerName.database.windows.net,1433;Database=$DBName;User Id=$SvcAdminAccount@$ServerName;Password=$SvcAdminPassword;MultipleActiveResultSets=true;Persist Security Info=true;";
$conn = New-Object System.Data.SqlClient.SqlConnection $connString try
{
$conn.Open()
$files = Get-ChildItem -Path $SqlFilesDirectory -File -Filter *.sql
$filesSorted = $files |Sort-Object -Property Name
$tran = $conn.BeginTransaction()
foreach ($file in $filesSorted)
{
$query = "SET XACT_ABORT ON; " $file
$cmd = New-Object System.Data.SqlClient.SqlCommand ($query, $conn, $tran)
[void]$cmd.ExecuteNonQuery()
}
$tran.Commit();
}
catch {
Write-Host "Record not Inserted ->"
$_.exception.message
}
finally {
$tran.Dispose()
$conn.Dispose()
}
注意方式
Dispose是使用,而不是Rollback,因為Dispose永遠不會拋出例外。它也在finally而不是catch
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343702.html
標籤:sql sql-server 电源外壳 查询语句
上一篇:選擇列更改后的第一行
下一篇:根據給定日期計算要排除的天數
