在 XML 标签中包含 udt:

Include udt: in the XML tag

使用 SQL 查询我需要获取如下数据。

<AcceptanceDateTime>
  <udt:DateTimeString formatCode="304">20161207010101Z</udt:DateTimeString>
</AcceptanceDateTime>

我尝试使用下面的 SQL 查询生成它,但它抛出错误

begin tran
    SELECT
        format( GETDATE(),'yyyyMMddHHmmss') +'Z' as 'udt:DateTimeString'                    
    INTO #tblCDSDeclarationAcceptanceDateTime

    SELECT * FROM #tblCDSDeclarationAcceptanceDateTime


    SELECT  
            '304' AS '@formatCode',
            Acc.[udt:DateTimeString]                        
    FROM    #tblCDSDeclarationAcceptanceDateTime Acc

    FOR XML PATH('AcceptanceDateTime'), TYPE

rollback tran

报错如下

Msg 6846, Level 16, State 4, Line 9
XML name space prefix 'udt' declaration is missing for FOR XML column name 'udt:DateTimeString'.

任何人都知道我如何将 "udt:" 作为标签名称。

您需要在查询中添加 "with xmlnamespaces"。试试这个:

begin tran
SELECT
    format( GETDATE(),'yyyyMMddHHmmss') +'Z' as 'udt:DateTimeString'                    
INTO #tblCDSDeclarationAcceptanceDateTime

SELECT * FROM #tblCDSDeclarationAcceptanceDateTime

;WITH XMLNAMESPACES ('udt' as udt) 
SELECT  
        '304' AS '@formatCode',
        Acc.[udt:DateTimeString]         
FROM    #tblCDSDeclarationAcceptanceDateTime Acc

FOR XML PATH('AcceptanceDateTime'), TYPE

rollback tran

首先,

<AcceptanceDateTime>
  <udt:DateTimeString formatCode="304">20161207010101Z</udt:DateTimeString>
</AcceptanceDateTime>

无效 xml,因为没有命名空间定义。这就是为什么你得到

XML name space prefix 'udt' declaration is missing for FOR XML column name 'udt:DateTimeString'.

要提供 xml 命名空间定义,请使用 WITH XMLNAMESPACES 子句。但这里还有更多 - 由于 formatCode 属性嵌入在 udt:DateTime 标记中并且省略了前缀,因此属性也应使用前缀规范。请参阅以下示例:

WITH XMLNAMESPACES('uri' AS udt)
SELECT *
FROM (VALUES (304, format(GETDATE(),'yyyyMMddHHmmss') +'Z')) T([udt:DateTimeString/@formatCode],[udt:DateTimeString])
FOR XML PATH('AcceptanceDateTime')

结果

<AcceptanceDateTime xmlns:udt="uri">
  <udt:DateTimeString formatCode="304">20181102094918Z</udt:DateTimeString>
</AcceptanceDateTime>

您需要先定义XMLNAMESPACES,在本例中它只是udt

;WITH XMLNAMESPACES ('udt' as udt)
SELECT '304' AS '@formatCode',
    Acc.[udt:DateTimeString] 
FROM #tblCDSDeclarationAcceptanceDateTime Acc
for xml path('AcceptanceDateTime'),type

产生

<AcceptanceDateTime xmlns:udt="udt" formatCode="304">
    <udt:DateTimeString>20181102140727Z</udt:DateTimeString>
</AcceptanceDateTime>