我有一个包含以下sql代码的txt文件(load_check_run_bmu.sql)。
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"
我需要做的是能够在powershell脚本中执行所有必要的SQL命令并删除sql txt文件和sqlcmd批处理文件
我知道我需要以下代码,但我正在努力研究如何将T-SQL脚本转换为可用于$ SqlCmd.CommandText变量的内容
$sqlServer = "."
$sqlDBName = "NorthWind"
$sqlConnectionString ="Server = $sqlServer; Database = $sqlDBName; Integrated Security = True"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = $sqlConnectionString
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
**$SqlCmd.CommandText = [SQL Command(s)]<====( Need assistance populating this)**
$SqlCmd.Connection = $SqlConnection
$SqlCmd.Connection.Open()
$ReturnValue = $SqlCmd.ExecuteNonQuery()
$SqlCmd.Connection.Close()
答案 0 :(得分:1)
使用双引号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"
为了解决这个问题,您需要为每个语句打开一个连接。因此,您可能希望创建一个连接到server \ database并运行给定查询的函数,例如(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 :(得分:-1)
使用invoke-SQLCMD Whick是sqlps模块的一部分