Powershell,Invoke-SqlCmd:如何从列中获取所有数据
Powershell, Invoke-SqlCmd: How to get all the data from a column
我有一个 table,其中有一列包含 JSON 数据。它可以相当大。我想使用 PowerShell 运行 查询单行中的 select JSON 数据。该命令如下所示:
Invoke-Sqlcmd -ServerInstance xxxxxx
-Database xxxxxx -Username xxxxxx -Password xxxxxx
-Query 'select [data] from jsontable where versionid=1922'
-MaxCharLength 700000 | Out-File .\my.json
命令有效,但结果只是整体的一小部分。例如在输出文件中我看到:
data
----
{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.FeedDerivedAttributeRuleData, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[{"$type":"TBSM.Vision.FpFtp.Common.Domain.Data.Fee...
但数据实际开始:
{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.FeedDerivedAttributeRuleData, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[{"$type":"TBSM.Vision.FpFtp.Common.Domain.Data.FeedDerivedAttributeRuleData, TBSM.Vision.FpFtp.Common.Domain.Data","FeedCode":"All","id":"a513ede8-d520-77b1-65f8-6377a24fdd83","mappingRules":{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.DerivedAttributeRuleDataCollection, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[{"$type":"TBSM.Vision.FpFtp.Common.Domain.Data.DerivedAttributeRuleDataCollection, TBSM.Vision.FpFtp.Common.Domain.Data","Rule Sequence":27,"classification":"Default","id":"3ad4c21c-7e69-e1ce-473f-d477767054ec","mappingRules":{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.RuleData, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[
然后继续。
如您所见,我指定了 MaxCharLength。我怎样才能停止 t运行cation 并获取我所有的 JSON 数据
根据我上面的评论,Invoke-Sqlcmd 正在 returning a System.Data.DataRow 并且 Out-File 正在将其序列化(并截断)到文件,而不是 [data] 中的原始字符串] 列。
作为一个简单的复制,这个脚本
PS> Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data" | out-file "c:\temp\temp.txt"
将此内容写入 temp.txt:
data
----
{...my json...}
并且只是为了证明 return 值是一个数据行:
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data"
PS> write-host $result.GetType().FullName
System.Data.DataRow
如果您想将 [data] 列的值写入结果集中,您需要从 Invoke-Sqlcmd 的结果中提取该值:
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data"
PS> $value = $result["data"]
PS> $value | out-file "c:\temp\temp.txt"
现在输出文件包含:
{...my json...}
请注意,如果结果集中有不止一行,它将是一个 Object[] 数组。
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data UNION SELECT '{...my other json...}' AS data"
PS> write-host $result.GetType().FullName
System.Object[]
并且您需要指定要写出的行(例如 [0]
):
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data UNION SELECT '{...my other json...}' AS data"
PS> $value = $result[0]["data"]
PS> $value | out-file "c:\temp\temp.txt"
希望这对您有所帮助...
我有一个 table,其中有一列包含 JSON 数据。它可以相当大。我想使用 PowerShell 运行 查询单行中的 select JSON 数据。该命令如下所示:
Invoke-Sqlcmd -ServerInstance xxxxxx
-Database xxxxxx -Username xxxxxx -Password xxxxxx
-Query 'select [data] from jsontable where versionid=1922'
-MaxCharLength 700000 | Out-File .\my.json
命令有效,但结果只是整体的一小部分。例如在输出文件中我看到:
data
----
{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.FeedDerivedAttributeRuleData, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[{"$type":"TBSM.Vision.FpFtp.Common.Domain.Data.Fee...
但数据实际开始:
{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.FeedDerivedAttributeRuleData, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[{"$type":"TBSM.Vision.FpFtp.Common.Domain.Data.FeedDerivedAttributeRuleData, TBSM.Vision.FpFtp.Common.Domain.Data","FeedCode":"All","id":"a513ede8-d520-77b1-65f8-6377a24fdd83","mappingRules":{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.DerivedAttributeRuleDataCollection, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[{"$type":"TBSM.Vision.FpFtp.Common.Domain.Data.DerivedAttributeRuleDataCollection, TBSM.Vision.FpFtp.Common.Domain.Data","Rule Sequence":27,"classification":"Default","id":"3ad4c21c-7e69-e1ce-473f-d477767054ec","mappingRules":{"$type":"System.Collections.Generic.List`1[[TBSM.Vision.FpFtp.Common.Domain.Data.RuleData, TBSM.Vision.FpFtp.Common.Domain.Data]], mscorlib","$values":[
然后继续。
如您所见,我指定了 MaxCharLength。我怎样才能停止 t运行cation 并获取我所有的 JSON 数据
根据我上面的评论,Invoke-Sqlcmd 正在 returning a System.Data.DataRow 并且 Out-File 正在将其序列化(并截断)到文件,而不是 [data] 中的原始字符串] 列。
作为一个简单的复制,这个脚本
PS> Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data" | out-file "c:\temp\temp.txt"
将此内容写入 temp.txt:
data
----
{...my json...}
并且只是为了证明 return 值是一个数据行:
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data"
PS> write-host $result.GetType().FullName
System.Data.DataRow
如果您想将 [data] 列的值写入结果集中,您需要从 Invoke-Sqlcmd 的结果中提取该值:
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data"
PS> $value = $result["data"]
PS> $value | out-file "c:\temp\temp.txt"
现在输出文件包含:
{...my json...}
请注意,如果结果集中有不止一行,它将是一个 Object[] 数组。
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data UNION SELECT '{...my other json...}' AS data"
PS> write-host $result.GetType().FullName
System.Object[]
并且您需要指定要写出的行(例如 [0]
):
PS> $result = Invoke-Sqlcmd -ServerInstance ".\sqlexpress" -query "SELECT '{...my json...}' AS data UNION SELECT '{...my other json...}' AS data"
PS> $value = $result[0]["data"]
PS> $value | out-file "c:\temp\temp.txt"
希望这对您有所帮助...