PowerShell Invoke-Sqlcmd - 不返回DataTable或DataSet

时间:2013-02-04 12:58:22

标签: .net dataset powershell-v2.0 boxing unboxing

如果我执行以下操作,

PS > $a = Invoke-Sqlcmd -ServerInstance <blah> -Database <blah> -Query "SELECT <blah>"

(哪里只是有效内容的占位符)

然后返回的类型如下所示:

PS > $a.gettype()

IsPublic IsSerial Name                         BaseType        
-------- -------- ----                         --------        
True     True     Object[]                     System.Array    

理想情况下,我想将$ a传递给一个接受System.Data.DataSet(或类似)形式的.NET类型的函数。

有关详细信息,我正在使用Chad Miller的SQLPS模块,它在Windows 7下的PowerShell 2上包装了早期SQL服务器(SQL Server 2008)的官方MS发行版。

我怀疑这可能与装箱和拆箱有关,但我不清楚。

有没有办法将查询结果作为System.Data.DataSet类型返回?

3 个答案:

答案 0 :(得分:1)

这是一种不使用invoke-sqlcmd返回[数据集]类型的方式(无法找到方法......)

$sql="SELECT <blah> FROM <dbo.blah>"
$connectionstring= "Server='myblahserver';database='blah';trusted_connection=yes;" 
$ds = new-object data.dataset 
$da = New-Object system.data.sqlclient.sqldataadapter $sql, $connectionstring 
$null = $da.Fill($ds) 
$ds.ExtendedProperties["sql"]= $sql 
$ds.ExtendedProperties["connectionstring"]= $connectionstring 
$ds

答案 1 :(得分:1)

从2016年7月版的sqlps开始,您可以简单地执行此操作:

Invoke-Sqlcmd "select 1 as foo" -OutputAs DataTables

好东西!

答案 2 :(得分:0)

我发现这样做的唯一方法是使用此处提供的代码创建一个将数组转换为数据表的函数:

https://gallery.technet.microsoft.com/scriptcenter/4208a159-a52e-4b99-83d4-8048468d29dd

加载此函数后,您可以获取invoke-sqlcmd的结果并将其传递到函数中,如下所示:

$results = Invoke-Sqlcmd -inputfile $scriptpath -ServerInstance $instance
$dt = $results | Out-Datatable