Вывод большого XML-файла из SQL с помощью Powershell - PullRequest
0 голосов
/ 23 мая 2019

У меня есть скрипт Powershell, который вызывает хранимую процедуру на SQL-сервере и выводит полученный XML-файл непосредственно в файл.Это работает для меньшего тестового файла, но падает с полным размером (~ 1,5 ГБ файла).

Хранимая процедура работает нормально.Я могу вызвать его на сервере SQL - проблема в том, что мне нужно открыть его на сервере SQL, затем вручную сохранить его в файл, а затем отредактировать этот файл, чтобы удалить перевод строки.Когда я запускаю скрипт, он падает, когда он пытается удалить промежуточные файлы в конце.Однако, когда я запускаю его построчно, он падает в строке invoke-sql.

#net use S: "\\processStore\projects"

# Create variables
$SQLquery = "DECLARE @return_value int; EXEC @return_value = [XML].[XMLdata];"
$outpath = "D:\MyDocuments\XML\XML files" 
$outfile = "TestOutput"

# Run the SQL command and store the object to a variable. Need to extend the timeout from the default.
$sql = invoke-sqlcmd -Database 'APP2021' -Query $SQLquery -serverinstance 'statdata' -QueryTimeout 100000

cd C:

# Store the SQL output as an interim text file
$sql.{XML_F52E2B61-18A1-11d1-B105-00805F49916B} | out-file -Filepath "$outpath\$outfile.txt" 

# Remove Linebreaks
(Get-Content "$outpath\$outfile.txt" -Raw).Replace("`r`n","") | Set-Content "$outpath\${outfile}_del.xml" -Force
format-xml "$outpath\${outfile}_del.xml" | Set-Content "$outpath\$outfile.xml" -Force

# Delete interim text files
del "$outpath\$outfile.txt"
del "$outpath\${outfile}_del.xml"

При запуске строк одна за другой код падает в строке invoke-sqlcmd с ошибкой:

invoke-sqlcmd : A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote 
host.)
At line:1 char:8
+ $sql = invoke-sqlcmd -Database 'APP2021' -Query $SQLquery -serverinst ...
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

1 Ответ

0 голосов
/ 24 мая 2019

Изменить сinvoke-sqlcmd -Database 'APP2021' -Query $ SQLquery -serverinstance 'statdata' -QueryTimeout 100000 вinvoke-sqlcmd -Database 'APP2021' -Query $ SQLquery -serverinstance 'statdata' -QueryTimeout 0

Установка QueryTimeout = 0 предотвратит тайм-аут запроса

...