2016-03-23 73 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