PowerShell 2.0运行一个SQL文件(具有多个SP和函数)

时间:2016-12-20 21:26:35

标签: sql sql-server powershell deployment powershell-v2.0

我有一个.sql文件,里面有多个存储过程和函数脚本。

我不想使用Invoke命令,因为我的服务器不支持它们。

目前我正在使用下面的代码,如果我的.sql文件只有一个存储过程或函数,它可以正常工作。



$scriptDetail = Get-Content $sqlScriptLocation	| Out-String 
$scriptDetail = $scriptDetail -creplace 'GO',''
$scriptDetail = $scriptDetail -replace 'SET ANSI_NULLS ON',''
$scriptDetail = $scriptDetail -replace 'SET QUOTED_IDENTIFIER ON',''
$ConnectionString = “Server=$dataSource;uid=$user; pwd=$cred;Database=$database;” 
$sqlCon = New-Object -TypeName System.Data.SqlClient.SqlConnection -ArgumentList $ConnectionString
$sqlCon.Open()
$sqlCmd = New-Object -TypeName System.Data.SqlClient.SqlCommand 
$sqlCmd.Connection = $sqlCon
$sqlCmd.CommandText = $scriptDetail
$sqlCmd.ExecuteNonQuery()		
$sqlCon.Close()




我正在替换上面代码中的GO和其他两个命令,因为它们会导致像

这样的错误
  

System.Data.SqlClient.SqlException(0x80131904):' GO'附近的语法不正确

     

System.Data.SqlClient.SqlException(0x80131904):'创建功能'必须是查询批处理中的第一个语句

     

必须声明标量变量" @ variableName"

1 个答案:

答案 0 :(得分:0)

我已经想出了一些挖掘后的解决方案,读取完整的文件并将其放入一个数组中然后运行ForEach循环,它将获得ForEach循环中的每一行,如果它不等于" GO"将它添加到另一个数组else数组(在其中添加每一行)执行它 代码如下



$SQLConnection = New-Object System.Data.SqlClient.SqlConnection 
$SQLConnection.ConnectionString = "Server=" + $YourServerName + ";Database="  + $YourDatabaseName + ";User ID= "  + $YourUserName + ";Password="  + $YourDbPassword + ";" 


$DirectoryPath = "C:\FolderName"
$Dep_SqlFiles = get-childitem -Recurse   $DirectoryPath -Include "*.sql"

$Dep_Info_DataEntry = @(Get-Content $Dep_SqlFiles.FullName) #Get all info of each file and put it in array



foreach($SQLString in  $Dep_Info_DataEntry)
{
   if($SQLString -ne "go") 
      { 
      #Preparation of SQL packet 
      $SQLToDeploy += $SQLString + "`n" 
      }
  Else
      {
        try{
      $SQLCommand = New-Object System.Data.SqlClient.SqlCommand($SQLToDeploy, $SQLConnection) 
 $SQLCommand.ExecuteNonQuery()
#use this if you want to log the output
#$SQLCommand.ExecuteScalar() | Out-File YourLogFile  -Append 

        }
        Catch
        {

        }
    
$SQLToDeploy = ""
      }

}