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')
);
我有以下内容:
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')
);