【问题标题】:Select mixed type columns including all values from an XML column?选择包含 XML 列中所有值的混合类型列?
【发布时间】:2020-01-21 19:05:29
【问题描述】:

我有一个包含混合列类型(intvarcharxml)的表。 varchar 列具有 XML 格式的数据,xml 列具有大型数据节点。我正在尝试选择包含 XML 的所有 varchar 列,以使用 SQL 代理作业步骤创建 XML 输出文件。我遇到的问题是定义为 XML 的列在文件中填充了很多空格,并且正在截断该列中的数据。表如下:

CREATE TABLE [dbo].[MixedTYPEXML](
    [col1] [varchar](4) NOT NULL,
    [col2] [int] NOT NULL,
    [xmlinText1] [varchar](190) NOT NULL,
    [JOBP] [xml] NULL
) 
GO

INSERT INTO [dbo].[MixedTypeXML]
           ([col1]
           ,[col2]
           ,[xmlinText1]
           ,[JOBP]
           )
     VALUES
           ('Prod'
           ,'35490'
           ,'<JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490">'
           ,'<PreCon><conditions id="CONDITIONS" /></PreCon>'
)
GO

我的选择语句是

SELECT col2, xmlinText1, JOBP from dbo.MixedTypeXML

预期结果如下,但实际结果可能有数千条记录。我只用一个小样本数据示例提取一条记录。

35490 &lt;JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490"&gt; &lt;PreCon&gt;&lt;conditions id="CONDITIONS" /&gt;&lt;/PreCon&gt;

这只是我尝试提取的列的一个子集。我基本上需要提取表中的所有列,包括 XML 定义的列,以将结果发送到本地驱动器上的输出表,而无需填充空格或截断数据。输出文件将是 XML 格式的文件。 JOBP 列示例数据只是一个 sn-p。实际数据包含几百行xml 节点。

我查看了很多关于如何提取节点和值的帖子,但我并没有尝试提取特定数据。我希望整个表创建一个 XML 输出文件。任何想法如何做到这一点?

【问题讨论】:

  • (1) 请确认输出文件为XML格式。 (2) 请更新您的问题并通过 INSERT 语句添加样本数据群体。 (3) 请根据样本数据提供所需输出的样本。

标签: sql-server xml tsql


【解决方案1】:

根据所需的输出,整个输出文件应为 XML 格式。它不能是部分 *.csv 文件与 XML 元素混合。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (
    [col1] VARCHAR(4) NOT NULL,
    [col2] INT NOT NULL,
    [xmlinText] VARCHAR(190) NOT NULL,
    [JOBP] XML NULL
);

INSERT INTO @tbl ([col1] ,[col2] ,[xmlinText] ,[JOBP])
VALUES
(
    'Prod'
    ,35490
    ,'<JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490"/>'
    ,'<PreCon><conditions id="CONDITIONS" /></PreCon>'
)
-- DDL and sample data population, end

SELECT col1, col2
    , TRY_CAST([xmlinText] AS XML) AS [xmlinText]
    , JOBP
FROM @tbl
FOR XML PATH('row'), TYPE, ROOT('root');

输出

<root>
  <row>
    <col1>Prod</col1>
    <col2>35490</col2>
    <xmlinText>
      <JOBP AllowExternal="1" name="JOBP.EXTRACTS_PHP_SSIS_POST_CORE#35490" />
    </xmlinText>
    <JOBP>
      <PreCon>
        <conditions id="CONDITIONS" />
      </PreCon>
    </JOBP>
  </row>
</root>

【讨论】:

  • @Yuzhak 这会起作用,除非我不想引入新标签。我不会提取包含非 XML 格式数据的列,只提取包含 XMLvarchar 列以及 XML 定义的列。所有XML 数据列都有必要的打开和关闭选项卡。
  • 在这种情况下,只需从 SELECT 语句中删除 col1col2 列。
  • @Yuzhak 但这仍然留下了&lt;root&gt;&lt;row&gt; 标签。我可以将括号内的PathROOT 值留空吗?
  • 您需要它们来保持生成的 XML 格式正确。看看:en.wikipedia.org/wiki/Well-formed_document
  • @Yuzhak 我的XML 没有那些人会很好地形成。这只是要添加额外的标签,然后我需要弄清楚如何删除。我有几个查询将以正确的顺序将XML 附加到文件中,我不想删除所有&lt;root&gt;&lt;row&gt; 标记。我主要关心的是在使用包含xml 数据的非xml 列进行select 查询时,在实际数据之前和之后有xml 类型的列填充空格。
【解决方案2】:

以上答案都不适合我。我最终开始工作的是使用 CONVERT 字符串功能。

SELECT col1, col2 , CONVERT(VARCHAR(MAX), JOBP) FROM @tbl

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多