我如何从存储过程中获取 select XML 元素?
How I can select XML element from Stored Procedure?
这是我需要在 XML 中显示的输出,生成自 SQL 服务器:
<Fo>
<Number>1</Number>
<CreatedDate>02/06/2016</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>02/06/2016</ModifiedDate>
<ModifiedBy>1</ModifiedBy>,
<Pro>
<Number>1</Number>
<LotNumber>Lot 1288</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 1299</LotNumber>
</Pro>
<Pro>
<Number>3</Number>
<LotNumber>Lot 1211</LotNumber>
</Pro>
</Fo>
这是我试过的代码,但仍然无法显示类似的结果。
SELECT *
(SELECT * FROM TAB_B FOR XML PATH(''))
FROM TBL_A
FOR XML PATH('')
大家好,我能得到显示结果的示例脚本吗?
<Pro>
side 是 DB 的循环结果,这意味着 1 family 有很多 child。
谢谢你。
“ModifiedBy”后面的逗号好像不对...
并且避免特定于文化的日期格式!:您的<CreatedDate>02/06/2016</CreatedDate>
可以被视为 6 月 2 日或 2 月 6 日,甚至可能会引发异常。在 XML 中使用 ISO8601
和
现在回答你的问题
这看起来像一个 1:n 相关的结构。但是没有关系(公用键)的提示。
如果这是一个与 1:n 相关的结构,我假设可能有多个“Fo”条目,其中 Pro 条目的数量不同。在这种情况下,最好用自己的“Pros”元素标签封装所有“Pro”元素,以将它们与其他元素分开:
在我的测试场景中,我向“tblB”添加了一列“ANumber”作为外键,并向“Fo”添加了两行,子行在“tblB”中。
此外,我添加了一个通用根,如果您的示例中只有一个“fo”元素,则您不需要它。
提示:
如果您想为“Pro”元素添加封装元素,只需将内部 SELECT
更改为 FOR XML PATH('Pro'),ROOT('Pros'),TYPE
:
例子
DECLARE @tblA TABLE(Number INT,CreatedDate DATETIME,CreatedBy INT,ModifiedDate DATETIME,ModifiedBy INT);
INSERT INTO @tblA VALUES
(1,{d'2016-06-02'},1,{d'2016-06-02'},1)
,(2,{d'2016-07-02'},1,{d'2016-07-02'},1);
DECLARE @tblB TABLE(Number INT, ANumber INT,LotNumber VARCHAR(100));
INSERT INTO @tblB VALUES
(1,1,'Lot 1288')
,(2,1,'Lot 1299')
,(3,1,'Lot 1211')
,(1,2,'Lot 222a')
,(2,2,'Lot 222b');
SELECT tblA.*
,(
SELECT tblB.Number
,tblB.LotNumber
FROM @tblB AS tblB
WHERE tblB.ANumber=tblA.Number
FOR XML PATH('Pro'),TYPE
)
FROM @tblA AS tblA
FOR XML PATH('Fo'),ROOT('root')
结果
<root>
<Fo>
<Number>1</Number>
<CreatedDate>2016-06-02T00:00:00</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>2016-06-02T00:00:00</ModifiedDate>
<ModifiedBy>1</ModifiedBy>
<Pro>
<Number>1</Number>
<LotNumber>Lot 1288</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 1299</LotNumber>
</Pro>
<Pro>
<Number>3</Number>
<LotNumber>Lot 1211</LotNumber>
</Pro>
</Fo>
<Fo>
<Number>2</Number>
<CreatedDate>2016-07-02T00:00:00</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>2016-07-02T00:00:00</ModifiedDate>
<ModifiedBy>1</ModifiedBy>
<Pro>
<Number>1</Number>
<LotNumber>Lot 222a</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 222b</LotNumber>
</Pro>
</Fo>
</root>
这是我需要在 XML 中显示的输出,生成自 SQL 服务器:
<Fo>
<Number>1</Number>
<CreatedDate>02/06/2016</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>02/06/2016</ModifiedDate>
<ModifiedBy>1</ModifiedBy>,
<Pro>
<Number>1</Number>
<LotNumber>Lot 1288</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 1299</LotNumber>
</Pro>
<Pro>
<Number>3</Number>
<LotNumber>Lot 1211</LotNumber>
</Pro>
</Fo>
这是我试过的代码,但仍然无法显示类似的结果。
SELECT *
(SELECT * FROM TAB_B FOR XML PATH(''))
FROM TBL_A
FOR XML PATH('')
大家好,我能得到显示结果的示例脚本吗?
<Pro>
side 是 DB 的循环结果,这意味着 1 family 有很多 child。
谢谢你。
“ModifiedBy”后面的逗号好像不对...
并且避免特定于文化的日期格式!:您的<CreatedDate>02/06/2016</CreatedDate>
可以被视为 6 月 2 日或 2 月 6 日,甚至可能会引发异常。在 XML 中使用 ISO8601
和
现在回答你的问题
这看起来像一个 1:n 相关的结构。但是没有关系(公用键)的提示。
如果这是一个与 1:n 相关的结构,我假设可能有多个“Fo”条目,其中 Pro 条目的数量不同。在这种情况下,最好用自己的“Pros”元素标签封装所有“Pro”元素,以将它们与其他元素分开:
在我的测试场景中,我向“tblB”添加了一列“ANumber”作为外键,并向“Fo”添加了两行,子行在“tblB”中。
此外,我添加了一个通用根,如果您的示例中只有一个“fo”元素,则您不需要它。
提示:
如果您想为“Pro”元素添加封装元素,只需将内部 SELECT
更改为 FOR XML PATH('Pro'),ROOT('Pros'),TYPE
:
例子
DECLARE @tblA TABLE(Number INT,CreatedDate DATETIME,CreatedBy INT,ModifiedDate DATETIME,ModifiedBy INT);
INSERT INTO @tblA VALUES
(1,{d'2016-06-02'},1,{d'2016-06-02'},1)
,(2,{d'2016-07-02'},1,{d'2016-07-02'},1);
DECLARE @tblB TABLE(Number INT, ANumber INT,LotNumber VARCHAR(100));
INSERT INTO @tblB VALUES
(1,1,'Lot 1288')
,(2,1,'Lot 1299')
,(3,1,'Lot 1211')
,(1,2,'Lot 222a')
,(2,2,'Lot 222b');
SELECT tblA.*
,(
SELECT tblB.Number
,tblB.LotNumber
FROM @tblB AS tblB
WHERE tblB.ANumber=tblA.Number
FOR XML PATH('Pro'),TYPE
)
FROM @tblA AS tblA
FOR XML PATH('Fo'),ROOT('root')
结果
<root>
<Fo>
<Number>1</Number>
<CreatedDate>2016-06-02T00:00:00</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>2016-06-02T00:00:00</ModifiedDate>
<ModifiedBy>1</ModifiedBy>
<Pro>
<Number>1</Number>
<LotNumber>Lot 1288</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 1299</LotNumber>
</Pro>
<Pro>
<Number>3</Number>
<LotNumber>Lot 1211</LotNumber>
</Pro>
</Fo>
<Fo>
<Number>2</Number>
<CreatedDate>2016-07-02T00:00:00</CreatedDate>
<CreatedBy>1</CreatedBy>
<ModifiedDate>2016-07-02T00:00:00</ModifiedDate>
<ModifiedBy>1</ModifiedBy>
<Pro>
<Number>1</Number>
<LotNumber>Lot 222a</LotNumber>
</Pro>
<Pro>
<Number>2</Number>
<LotNumber>Lot 222b</LotNumber>
</Pro>
</Fo>
</root>