具有XML路径的默认命名空间
考虑以下SQL:具有XML路径的默认命名空间,xml,tsql,for-xml-path,Xml,Tsql,For Xml Path,考虑以下SQL: ;WITH XMLNAMESPACES(DEFAULT 'http://www.mynamespace.co.uk') ,CTE_DummyData AS ( select id=1 ) select TOP 1 [@ID]=1, (select top 1 [@ID] = 1 FROM CTE_DummyData FOR XML PATH ('Child'), TYPE) from CTE_DummyData FOR XML PATH ('Parent
;WITH XMLNAMESPACES(DEFAULT 'http://www.mynamespace.co.uk')
,CTE_DummyData AS (
select id=1
)
select TOP 1
[@ID]=1,
(select top 1 [@ID] = 1 FROM CTE_DummyData FOR XML PATH ('Child'), TYPE)
from CTE_DummyData
FOR XML PATH ('Parent')
返回xml:
<Parent xmlns="http://www.mynamespace.co.uk" ID="1">
<Child xmlns="http://www.mynamespace.co.uk" ID="1" />
</Parent>
我需要的是只在根元素上返回带有xmlns声明的xml。例如:
<Parent xmlns="http://www.mynamespace.co.uk" ID="1">
<Child ID="1" />
</Parent>
有办法做到这一点吗
注:
上面的SQL是对实际代码的一种极端简化,它生成了一个复杂的文档,因此如果不给我几天额外的工作时间,从FOR XML PATH更改实际上不是一个选项。要想清楚,整个文档的顶层需要有NS,所有子级都应该没有。您可以使用
可以使用UDF生成子节点。例如
ALTER FUNCTION [dbo].[udf_get_child_section] (
@serviceHeaderId INT
)
RETURNS XML
BEGIN
DECLARE @result XML;
SELECT @result =
(
SELECT 1 AS 'ChildElement'
FOR XML PATH('Child')
)
RETURN @result
END
GO
DECLARE @Ids TABLE
(
ID int
)
INSERT INTO @Ids
SELECT 1 AS ID
UNION ALL
SELECT 2 AS ID
;WITH XMLNAMESPACES (DEFAULT 'http://www...com/content')
SELECT
[dbo].[udf_get_child_section](ID)
FROM
@Ids
FOR XML PATH('Parent')
我找不到方法,但它们应该具有相同的含义-为什么不能使用第一种形式?@Damien:这是数据迁移过程的一部分。虽然第一个文档的含义相同(如您所说),但当我们将其传递到(第三方)导入web服务时,它不起作用。我认为问题在于它使用子查询。如果您使用单个查询,并使用
[Child/@ID]
定义子元素,它可以正常工作,但这需要重新思考代码(我继承了)+1 aargh-在我的实际情况下尝试和实现会很糟糕!这个想法很好,我已经找到了一种方法来解决我的问题。最初的想法是,这是一个更复杂文档的简化,所以这个想法是,只有顶层元素显示NS,而所有的子元素(在所有级别)都没有。如果可以将解决方案转换为顶级元素由UDF生成,而其他元素则不由UDF生成,那么该解决方案将是非常好的。你认为你能那样做吗?
ALTER FUNCTION [dbo].[udf_get_child_section] (
@serviceHeaderId INT
)
RETURNS XML
BEGIN
DECLARE @result XML;
SELECT @result =
(
SELECT 1 AS 'ChildElement'
FOR XML PATH('Child')
)
RETURN @result
END
GO
DECLARE @Ids TABLE
(
ID int
)
INSERT INTO @Ids
SELECT 1 AS ID
UNION ALL
SELECT 2 AS ID
;WITH XMLNAMESPACES (DEFAULT 'http://www...com/content')
SELECT
[dbo].[udf_get_child_section](ID)
FROM
@Ids
FOR XML PATH('Parent')