使用PowerShell对数据库执行大型sql文件

时间:2016-02-04 00:47:20

标签: sql powershell

我试图对数据库执行QC脚本。这个脚本包含游标的使用,很多sql语句(~400行),使用表变量和各种有趣的东西。

脚本在SSMS中执行正常。

我试图通过powershell运行它:

$adOpenStatic = 3
$adLockOptimistic = 3
$TargetDatabaseName = 'databaseCatalogName'
$DatabaseName = 'DatabaseName'
$QCChecksLocation = 'C:\thisPathWorks\QC Checks.sql'
Start-Process odbcconf -wait -ArgumentList "/A {CONFIGSYSDSN ""SQL Server Native Client 11.0"" ""DSN=$TargetDatabaseName|Server=$DatabaseName|Database=$TargetDatabaseName|Trusted_Connection=Yes""}"


$TargetConn = New-Object -comObject ADODB.Connection
$QCResults = New-Object -comobject ADODB.Recordset
$TargetConn.ConnectionString = "DSN=$TargetDatabaseName"

$TargetConn.Open()

$SQL = get-content $QCChecksLocation
$QCResults.Open($SQL,$TargetConn,$adOpenStatic,$adLockOptimistic)

这会导致错误:异常调用"打开"用" 4"参数:"参数类型错误,超出可接受的范围,或彼此冲突。"

有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

看看我希望的是正确的reference for ADODB.Recordset Open Method我怀疑它不喜欢数组。

  

来源

     

可选。 Variant ,其值为有效的Command对象, SQL语句,表名,存储过程调用,URL或包含的文件名或Stream对象持久存储的Recordset。

它说变种,但我确信它不需要数组。 Get-Content将返回多行文件的字符串数组。干净的书面SQL语句使用多行,因此不能期待你的。

如果您至少拥有PowerShell v3.0,则可以使用-Raw的{​​{1}}开关将文件作为单个字符串返回。使用v2.0,您可以直接进入Get-Content

Out-String

上述两个命令都应该与$SQL = Get-Content -Raw $QCChecksLocation $SQL = Get-Content $QCChecksLocation | Out-String 相同。这应该适用于您的Open方法。