Прочитайте файлы sql. Исключите список файлов из таблицы SQL и выполните все файлы в одной транзакции с помощью PowerShell. - PullRequest
0 голосов
/ 26 января 2019

У меня нет эксперта в силовой оболочке. Мне нужен скрипт / подход, который обрабатывает следующее требование.

У меня есть список файлов в папке и имена файлов, как показано ниже.

001_File.sql
002_File.sql
003_File.sql
004_File.sql

Также у меня есть таблица на сервере sql, в которой хранится информация об имени файла.

TableName : исполняемый файл со столбцом FileName.

002_File.sql
004_File.sql

Мое требование - прочитать файлы, которые доступны в папке, но отсутствуют в таблице .

У меня есть только для чтения файлов:

001_File.sql
003_File.sql

Теперь мне нужно выполнить эти два файла в последовательном порядке в рамках одной транзакции на SQL Server. Как мне нужно откатить все транзакции, если произошла ошибка.

На данный момент я написал что-то вроде оболочки питания.

$QueryResult = Invoke-Sqlcmd -ServerInstance 'MyServer' -Database 'MyDb' -Query "SELECT DISTINCT FNames from TableName"

Get-ChildItem "E:\Testing\" -Filter *.sql | Sort-Object $_.Name|
Foreach-Object {
    $FileFullpath= $_.FullName

     Write-Host $FileFullpath

     $FileName = $_.Name

     Write-Host $FileName

     if(!$QueryResult.FName.Contains($FileName))
     {
        invoke-sqlcmd -inputfile $FileFullpath -serverinstance "servername\serverinstance" -database "mydatabase"
     }

}

Пожалуйста, предложите мне какой-нибудь сценарий.

Вызовы:

  1. Как читать файлы в последовательном порядке, так как они имеют начальные нули. Будет ли сортироваться указанный выше `Sort-Object $ _. Name '?
  2. Как выполнить весь список файлов за одну транзакцию.

Спасибо

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

Наконец, я написал скрипт, используя объекты SMO для обработки оператора GO и транзакций.

$SqlFilePath = "D:\Roshan\Testing\SQL\"

$serverName = "MyServer"
$databaseName = "MyDB"

$QueryResult = Invoke-Sqlcmd -ServerInstance $serverName -Database $databaseName -Query "SELECT DISTINCT FName from dbo.TableName" -AS DataRows

$connection = new-object system.data.SqlClient.SQLConnection("Data Source=$serverName;Integrated Security=SSPI;Initial Catalog=$databaseName;Connection Timeout=600;Max Pool Size=10"); 
$Server = new-Object Microsoft.SqlServer.Management.Smo.Server(New-Object Microsoft.SqlServer.Management.Common.ServerConnection($connection))

$script_contents ="SET XACT_ABORT ON
                GO
                BEGIN TRANSACTION 
                GO"


Get-ChildItem $SqlFilePath -Filter *.sql| Sort-Object $_.Name|

ForEach-Object {

if(!$QueryResult.FName.Contains($_.Name))
{
    Write-Host $_.Name -ForegroundColor Magenta

    #[string]$script_contents = Get-Content $_.FullName
    $script_contents += [IO.File]::ReadAllText($_.FullName)

   #Write-Host $script_contents
   #$Server.ConnectionContext.ExecuteNonQuery($script_contents)
} 

} 

$script_contents+= " COMMIT TRANSACTION;"

$Server.ConnectionContext.ExecuteNonQuery($script_contents)
0 голосов
/ 28 января 2019

Наконец я сделал что-то вроде этого.

 $QueryResult = Invoke-Sqlcmd -ServerInstance 'MyServer' -Database 'MyDb' -Query "SELECT DISTINCT FNames from TableName"

 $FullScript = @()
 $FullScript += "BEGIN TRANSACTION;"


Get-ChildItem "E:\Testing\" -Filter *.sql | Sort-Object $_.Name|
Foreach-Object {

 if(!$QueryResult.FName.Contains($_.Name))
 {
    $FullScript += Get-Content $_.FullName
 }
}

$FullScript += "COMMIT TRANSACTION;"

sqlcmd -S localhost -d test -Q "$FullScript"
0 голосов
/ 28 января 2019

Попробуйте это ...

#get list of filenames from database...
$QueryResult = Invoke-Sqlcmd -ServerInstance 'MyServer' -Database 'MyDB' -Query "SELECT DISTINCT FNames from TableName" | Select-Object -ExpandProperty FileName

#get files from folder whose names are not in $queryresult...
$files = Get-ChildItem -Path E:\Testing -Filter *.sql | ? {(!($QueryResult.Contains($_.BaseName)))} | Sort-Object Name

#get the content of each $file and replace "GO" with empty string, etc...
$queries = @()

foreach ($file in $files) {

    $queries += (Get-Content $file.FullName).replace("GO","")

}

#join each query into a single T-SQL statement...
$singleTransaction = $queries -join ";"

#execute statement...
Invoke-Sqlcmd -ServerInstance 'SERVER' -Database 'DB' -Query $singleTransaction

Чтобы действительно выполнить «одну транзакцию» ... вам может потребоваться согласованный ввод для изменения и помещения в один оператор. Я не уверен, как вам нужно это сделать.

0 голосов
/ 26 января 2019

Вы можете написать что-нибудь в своем скрипте

select filename from tablename; >> file.out
--->002_File.sql

grep -v 'file.out' * >> excludedfile.out
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...