На самом деле, трудно поверить, что MS допустила такую ошибку или, возможно, это не ошибка.Как бы то ни было, когда вы запускаете Invoke-SqlCmd
и с запросом, подобным следующему,
select * from table1 where id = 1111 -- non-exists id, this select returns nothing
select * from table2 where id = 2222 -- exists id, this select returns something
В SSMS вы можете видеть 2 набора результатов, первый из которых пуст.
Однако, Invoke-SqlCmd
ничего не возвращает, когда первый набор результатов пуст, даже другие наборы результатов нет.Мое лицо было похоже на? _?
Другой подход - написать собственную функцию вызова SQL, например, следующую, чтобы возвращать любые наборы результатов, даже пустые.
$sql_Conn = New-Object System.Data.SqlClient.SQLConnection
$sql_Conn.ConnectionString = $sqlConnectionString
$sql_Conn.Open()
$sql_cmd = New-Object system.Data.SqlClient.SqlCommand($Query, $sql_Conn)
$sql_ds = New-Object system.Data.DataSet
$sql_da = New-Object system.Data.SqlClient.SqlDataAdapter($sql_cmd)
[void]$sql_da.fill($sql_ds)
$sql_Conn.Close()
return $sql_ds
Все хорошо, покаНовая проблема возникает с ключевым словом GO
в вашем скрипте, вы должны знать это, если вы используете SSMS.Дело в том, что GO
не является командой SQL.это просто разделитель, используемый SSMS.Коды, разработанные MS, могут хорошо обрабатывать GO
, например, SSMS, Invoke-SqlCmd
и sqlcmd.exe
.Если вы используете собственную функцию вызова SQL, вы получите проблему с синтаксисом
Неверный синтаксис рядом с 'GO'
Хотя люди, скорее всего, попросят вас обновить скрипт SQL доудалите все GO
строки, однако, вещи не всегда находятся под контролем, обычно нужно работать с разными людьми и командами.
Наконец, я должен урезать GO
в моих сценариях, как показано ниже
$Query = $Query -ireplace "(^|\r|\n)[ \t]*\bGO\b[ \t]*(\r|\n|$)", '$1$2'
https://github.com/LarrysGIT/Invoke-Sql
Конечно, история не закончена, тем больше я пытаюсь автоматизировать задачи, связанные с SQL.Чем больше проблема найдена.Существует несколько способов автоматического выполнения сценария SQL.Пока ни один из них не идеален.
Invoke-Sql
(Мой собственный сценарий)
* Is able to handle the key separator 'GO'
* Is able to handle duplicate columns
* Fully support multiple result sets, even the first result set is empty
* Unable to handle `Create or alter` keywords if there are contents ahead
* Unable to handle special characters like '194 160' (non-breaking space) in SQL script (edited by some document edit tool, MS word for example)
Invoke-SqlCmd
* Is able to handle the key separator 'GO'
* Is able to handle special characters like 'non-breaking space'
* Unable to handle duplicate columns
* Unable to fully handle multiple result sets (when the first table is empty)
sqlcmd.exe
* Is able to handle all things (briefly tested)
* The returned result sets are plain text, hard to parse
Microsoft.SqlServer.SMO
оснастка
* The API of SQL server management studio
* Theoretically should be able to handle all cases
* Need to dig more