2016-12-20 1 views
0

У меня есть файл .sql, в котором есть несколько скриптов хранимых процедур и функций.PowerShell 2.0 Запустите один файл SQL (с несколькими SP и функциями)

Я не хочу использовать команды Invoke, потому что мой сервер их не поддерживает.

В настоящее время я использую код ниже, который отлично работает, если в моем файле .sql имеется только одна хранимая процедура или функция.

$scriptDetail = Get-Content $sqlScriptLocation \t | 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() \t \t 
 
$sqlCon.Close()

Я замена GO и две другие команды в коде выше, потому что они casused ошибки как

System.Data.SqlClient.SqlException (0x80131904): Неправильный синтаксис около ' GO '

System.Data.SqlClient.SqlException (0x80131904):' CREATE FUNCTION 'должен быть первым оператором в запросе партия

Необходимо объявить скалярную переменную «@variableName»

+0

$ sqlScriptLocation = "C: \ All_Restore_PROCEDUREFunctiond.sql" – TahirAyoub

ответ

0

Я придумал решение после некоторого копания, прочитать весь файл и поместить его в массив, а затем запустить цикл ForEach, он получит каждая строка в цикле ForEach поставил условие, если его не равно «GO» добавить его в другой массив еще массив (в котором вы добавляете каждую строку) выполнить его код ниже

$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 = "" 
 
     } 
 

 
} 
 

 
     

Смежные вопросы