首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >invoke-sqlcmd fails对某些类型的查询不显示任何结果

invoke-sqlcmd fails对某些类型的查询不显示任何结果
EN

Stack Overflow用户
提问于 2018-10-21 17:36:13
回答 1查看 2.1K关注 0票数 1
Invoke-Sqlcmd -ServerInstance '.' -Database 'MyDB' 
      -Query 'EXEC SprocA  @param1= "value";EXEC SprocB  @param1= "value";'

基本上,我让我的Invoke-SqlCmd运行一个调用两个存储过程的查询。这两个存储过程都输出一组行。

但是,如果sprocA不输出任何结果(空的select结果或没有行),那么invoke命令似乎不会打印第二个sprocB的输出,即使它有数据。

如果我在Invoke-SqlCmd命令查询参数中更改了存储过程的顺序,那么这将很好地工作,并返回第一个存储过程的输出。

如果我有三个存储过程调用,其中第一个返回数据,第二个不返回数据,第三个返回数据,它将打印第一个结果和第三个结果的输出。

基本上,只有当第一个存储过程没有输出时,它才不会打印任何输出。看起来很奇怪。

我能做些什么来解决这个SQL问题呢?会不会是PowerShell的问题?

我还可以用两条Select语句重现这一点,其中一条语句返回数据,另一条不返回数据。

EN

回答 1

Stack Overflow用户

发布于 2019-08-16 08:10:11

事实上,很难相信微软犯了这样的错误,也许这不是一个错误。无论如何,当您运行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上,你可以看到两个结果集,第一个是空的。

但是,当第一个结果集为空时,Invoke-SqlCmd不会返回任何内容,即使其他结果集也不为空。我的脸就像?_一样

另一种方法是编写您自己的调用SQL函数,如following,以返回任何结果集,甚至是空的结果集。

    $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-SqlCmdsqlcmd.exe。如果您使用自己SQL调用函数,则会出现语法问题

Incorrect syntax near '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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52913891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档