Sql server 在powershell中使用invokeSQL命令以换行方式输入XML数据

Sql server 在powershell中使用invokeSQL命令以换行方式输入XML数据,sql-server,xml,powershell,Sql Server,Xml,Powershell,我使用的是powershell脚本,它将从FOR XML EXPLICIT类型的sqlquery返回XML。 现在,查询返回了带有标题和虚线的列中的XML XML 32776498797309 --------------------- <data>asdsafafaf<\data><value>dfsasfasfdfasdf.... dfdsfsdgregrge<\value><value>asdfasdfadfadfsda<\

我使用的是powershell脚本,它将从FOR XML EXPLICIT类型的sqlquery返回XML。 现在,查询返回了带有标题和虚线的列中的XML

XML 32776498797309
---------------------
<data>asdsafafaf<\data><value>dfsasfasfdfasdf....
dfdsfsdgregrge<\value><value>asdfasdfadfadfsda<\v
alue>

尝试使用“设置内容”而不是“输出文件”。Out文件将使用主机/控制台格式,而set内容不使用。您需要处理将XML输出到字符串

invoke-sqlcmd ....| select -expandproperty XML | set-content -path $outputFilePath
已编辑。添加了完整的工作示例

#Contents of my test inputfile.sql:
SELECT CAST ('<EVENT_INSTANCE>
  <EventType>CREATE_TABLE</EventType>
  <PostTime>2011-04-26T15:05:21.333</PostTime>
  <SPID>56</SPID>
  <ServerName>Z001\SQL1</ServerName>
  <LoginName>Contoso\u00</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>AdventureWorksDW2008R2</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>AdventureWorksDWBuildVersion</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>CREATE TABLE [dbo].[AdventureWorksDWBuildVersion] (
[DBVersion] [nvarchar] (50) NULL,
[VersionDate] [datetime] NULL 
) ON [PRIMARY];
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>' AS XML)



$inputFilePath = "C:\Temp\inputfile.sql"
$dbHostName = "$env:computername\sql1"
$outputFilePath = "C:\Temp\output.txt"

#Notice Extra Line Breaks
invoke-sqlcmd -inputFile $inputFilePath -serverinstance $dbHostName | 
    Format-Table -hide -Wrap -AutoSize |
    Out-File -filePath $outputFilePath -width 4096

#No Extra line breaks using set-content
invoke-sqlcmd -inputFile $inputFilePath -serverinstance $dbHostName | select -expandproperty Column1 | set-content -Path $outputFilePath
#我的测试输入文件.sql的内容:
选择CAST('
创建表
2011-04-26T15:05:21.333
56
Z001\SQL1
Contoso\u00
dbo
冒险工作DW2008R2
dbo
AdventureWorksDWBuildVersion
桌子
创建表[dbo]。[AdventureWorksDWBuildVersion](
[DBVersion][nvarchar](50)空,
[VersionDate][datetime]空
)关于[初级];
'作为XML)
$inputFilePath=“C:\Temp\inputfile.sql”
$dbHostName=“$env:computername\sql1”
$outputFilePath=“C:\Temp\output.txt”
#注意额外的换行符
调用sqlcmd-inputFile$inputFilePath-serverinstance$dbHostName |
格式表-隐藏-换行-自动调整大小|
输出文件-文件路径$outputFilePath-宽度4096
#使用集合内容时没有额外的换行符
调用sqlcmd-inputFile$inputFilePath-serverinstance$dbHostName | select-expandproperty Column1 | set content-Path$outputFilePath

使用Invoke-SQLCMD命令的-MaxCharLength参数。默认值为4000。它将截断大型XML


请参见

out字符串也将截断数据而不是out字符串。请参阅我修改后的示例,将输出文件的输出与设置的内容代码进行比较。我仍然得到换行符和额外的空格。我有大量的XML数据,这是一个问题吗?也许源代码中有一行中断。您可以通过join运行它:$xml=invoke sqlcmd-inputfile$xml=$xml-join
#Contents of my test inputfile.sql:
SELECT CAST ('<EVENT_INSTANCE>
  <EventType>CREATE_TABLE</EventType>
  <PostTime>2011-04-26T15:05:21.333</PostTime>
  <SPID>56</SPID>
  <ServerName>Z001\SQL1</ServerName>
  <LoginName>Contoso\u00</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>AdventureWorksDW2008R2</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>AdventureWorksDWBuildVersion</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>CREATE TABLE [dbo].[AdventureWorksDWBuildVersion] (
[DBVersion] [nvarchar] (50) NULL,
[VersionDate] [datetime] NULL 
) ON [PRIMARY];
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>' AS XML)



$inputFilePath = "C:\Temp\inputfile.sql"
$dbHostName = "$env:computername\sql1"
$outputFilePath = "C:\Temp\output.txt"

#Notice Extra Line Breaks
invoke-sqlcmd -inputFile $inputFilePath -serverinstance $dbHostName | 
    Format-Table -hide -Wrap -AutoSize |
    Out-File -filePath $outputFilePath -width 4096

#No Extra line breaks using set-content
invoke-sqlcmd -inputFile $inputFilePath -serverinstance $dbHostName | select -expandproperty Column1 | set-content -Path $outputFilePath