SQL XMLNS 因 sp_executesql 存储过程而失败

SQL XMLNS failing with sp_executesql sproc

我有以下内容:

DECLARE @csXml          XML
      , @changeStatus   XML
      , @tNum           NVARCHAR(25) = '0001aa17'

SELECT @csXml = ChangeSet
  FROM [Issues]
 WHERE [TrackingNumber] = @tNum

SET @changeStatus =
(
    SELECT NEWID()                                      AS [@id]
            , 'me@sample.com'                           AS [@by]
            , '1E910737-D78C-E711-9C04-00090FFE0001'    AS [@byAccountId]
            , '2018-01-18T18:39:03.220Z'                AS [@when]
            , 'Status'      AS [property/@id]
            , 'Status'      AS [property/@name]
            , 'In Review'   AS [property/@old]
            , 'Closed'      AS [property/@new]
            , '' AS [collections]
    FOR XML PATH('change')
);

-- Add node to XML...
SET @csXml.modify(N'declare default element namespace "http://www.sample.com/ChangeSet/2017/09"; 
                         insert sql:variable("@changeStatus") as last into (/changes)[1]');

SET @ParamDef = N'@TrackingNumber NVARCHAR(25)
                , @ChangeSet XML';

SET @sql = 'EXEC [SaveIssue] @TrackingNumber, @ChangeSet';

EXEC [sys].[sp_executesql] @sql
                         , @paramDef
                         , @TrackingNumber = @tNum
                         , @ChangeSet = @csXml;

我收到以下错误:

Msg 6965, Level 16, State 1, Procedure SaveIssue, Line 27 XML Validation: Invalid content. Expected element(s): '{http://www.sample.com/ChangeSet/2017/09}change'. Found: element 'change' instead. Location: /:changes[1]/:change[4].

我知道我正在调用的存储过程抛出了这个错误。我想不通的是如何正确调用此存储过程以使其停止! :)

存储过程的(截断的)定义是:

CREATE PROCEDURE [SaveIssue]
    ( @TrackingNumber NVARCHAR(25)
    , @ChangeSet XML(DOCUMENT Reference.sample) = N'<changes xmlns="http://www.sample.com/ChangeSet/2017/09" />'  
    )
AS
BEGIN
...
END

我尝试将 XMLNS 定义绑定到 XML 声明,将最终的 @csXml 转换为 XML 并返回到 XML(DOCUMENT ...),等等。到目前为止,我所做的一切都没有奏效。我还为 @changeStatus SELECT 尝试了 WITH XMLNAMESPACE...。我有点难过!

使用 CTE 为我解决了这个问题。首先,我必须将 SET 更改为 SELECT。然后添加 WITH XMLNAMESPACE... 部分。这是创建我要插入的节点的更正部分:

;WITH XMLNAMESPACES (DEFAULT 'http://www.sample.com/ChangeSet/2017/09')
SELECT @changeStatus =
(
    SELECT NEWID()                                      AS [@id]
            , 'me@sample.com'                           AS [@by]
            , '1E910737-D78C-E711-9C04-00090FFE0001'    AS [@byAccountId]
            , '2018-01-18T18:39:03.220Z'                AS [@when]
            , 'Status'      AS [property/@id]
            , 'Status'      AS [property/@name]
            , 'In Review'   AS [property/@old]
            , 'Closed'      AS [property/@new]
            , '' AS [collections]
    FOR XML PATH('change')
);