Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有XML路径的默认命名空间_Xml_Tsql_For Xml Path - Fatal编程技术网

具有XML路径的默认命名空间

具有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

考虑以下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')
返回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')