事情是這樣的:
#Variables
$sqlServer = "."
$sqlDBName = "master"
$sqlQuery = "CREATE DATABASE test"
# Create the connection string
$sqlConnectionString ="Server = $sqlServer; Database = $sqlDBName; Integrated Security = True"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $sqlConnectionString
#Create the SQL Command object
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $SqlQuery
$SqlCmd.Connection = $SqlConnection
#Open SQL connection
$SqlCmd.Connection.Open()
#Execute the Query
$ReturnValue = $SqlCmd.ExecuteNonQuery()
- 編輯
技術上GO
不是T-SQL命令。這是由Microsoft SQL工具(Management Studio,isql,osql)識別的批量結束標記。所以這就是爲什麼當你直接執行語句時,它不被識別。 '真正的'解決方案是消除GO語句,或將語句拆分爲單獨的批處理過程(物理或字符串)。拆分使用SQL管理對象從理論上可以處理 「轉到」 語句( 「GO」))
,或備用(SqlCommand() ExecuteNonQuery() truncates command text):
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null
$SMOServer = New-Object ('Microsoft.SqlServer.Management.Smo.Server')
$SMOServer.ConnectionContext.ConnectionString = $sqlConnectionString
$SMOServer.ConnectionContext.ExecuteNonQuery($sqlQuery)
- 編輯2
或者,如果你能「T使用SQL管理對象,和你有‘GO’語句,東西快速和骯髒的是,你可以分割字符串和使用這樣的代碼:
#Variables
$sqlServer = "."
$sqlDBName = "master"
$sqlQuery = "CREATE DATABASE test; GO; CREATE DATABASE test2; GO;"
# Create the connection string
$sqlConnectionString ="Server = $sqlServer; Database = $sqlDBName; Integrated Security = True"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $sqlConnectionString
$sqlQuery -split "GO;" | ForEach-Object{
if($_ -ne "")
{
#Create the SQL Command object
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = $_
$SqlCmd.Connection = $SqlConnection
#Open SQL connection
$SqlCmd.Connection.Open()
#Execute the Query
$ReturnValue = $SqlCmd.ExecuteNonQuery()
#Close the connection
$SqlCmd.Connection.Close()
}
}
以及你只能在數據庫中創建模式,因爲PowerShell沒有內置的數據庫引擎,我認爲這不會工作。你可以嘗試連接到一個sql server – Paul
@Paul是的,一個SQL Server實例是可用的,只是它可能在本地(不可能)或在另一臺網絡機器上(極有可能)。問題是,我發現的所有PS cmdlet只有在您嘗試運行腳本的地方安裝了SQL Server時纔有效。 – emzero