2016-03-23 74 views
1

我有一個包含以下sql代碼的txt文件(load_check_run_bmu.sql)。將T-SQL文件寫入PowerShell腳本

RESTORE DATABASE Address from disk='C:\dir\path\address.bmu' 

Use Client 
GO 
Select f_name 
From 
cst.name 

USE wage 
GO 
Exec sp_salary 

Use Client 
GO 
Select f_name 
From 
cst.name 

然後我有一個包含一個批處理文件:

sqlcmd -S .\NorthWind -i"C:\scripts\load_check_run_bmu.sql" 

我需要做的是能夠執行所有必要的SQL命令的PowerShell腳本並消除SQL txt文件是什麼和SQLCMD批處理文件

我知道我需要下面的代碼,但我掙扎如何在T-SQL腳本轉換爲可用於$ SqlCmd.CommandText變量

0123東西

回答

0

T-SQL.txt文件放入使用雙引號"的字符串中,並取出GO語句。您也可以結束每個語句;確保查詢不會弄混和查詢應無故障運行:

$TSQLString = "RESTORE DATABASE Address from disk='C:\dir\path\address.bmu'; 

Use Client; 
Select f_name 
From 
cst.name; 

USE wage; 
Exec sp_salary; 

Use Client; 
Select f_name 
From 
cst.name;" 

然後使用字符串爲您的變量:

$SqlCmd.CommandText = $TSQLString 

它也像您在上面的查詢中使用多個數據庫。如果是這種情況,則此方法可能無法正常工作,請使用以下語句連接到單個數據庫。

$sqlConnectionString ="Server = $sqlServer; Database = $sqlDBName; Integrated Security=True" 

爲了解決這個問題,您需要爲每個語句打開一個連接。因此,您可能想要創建一個連接到服務器\數據庫並運行給定查詢的函數,例如(Run-Sql將是您需要創建的函數)。

$SQLQuery1 = "RESTORE DATABASE Address from disk='C:\dir\path\address.bmu';" 
$SQLQuery2 = "Select f_name From cst.name;" 
$SQLQuery3= "Exec sp_salary;" 
$SQLQuery4 = "Select f_name From cst.name;" 

# Run all statments 
Run-SQL -query $SQLQuery1 -DB "NorthWind" -Server "." 
Run-SQL -query $SQLQuery2 -DB "Client" -Server "." 
Run-SQL -query $SQLQuery3 -DB "wage"  -Server "." 
Run-SQL -query $SQLQuery4 -DB "Client" -Server "." 
+1

「Go」語句如何?我知道這是T-SQL中的批處理分隔符,而不是有效的sql命令。 那麼如何處理「GO」語句,以避免產生錯誤並取得必要的結果? – Gary

+1

你有什麼錯誤? GO是由'sqlcmd'和'osql'實用程序和SQL Server Management Studio代碼編輯器識別的命令。 https://msdn.microsoft.com/en-gb/library/ms188037.aspx - 請參閱備註部分。你正在運行'SQL Server 2008'嗎? – Richard

+0

使用「0」參數調用「ExecuteNonQuery」的異常:「GO'附近的語法錯誤。」 在C:\ temp \ test.ps1:47 char:9 + $ ReturnValue = $ SqlCmd.ExecuteNonQuery() + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:SqlException – Gary