如何从参数中格式化SQL Server中的XML?
我正在尝试制作一个包装器参数化的存储过程,以执行另一个以XML为输入的存储过程(用于SSRS)。
这就是当前运行XML存储过程的方式(@xml
参数实际上是文本类型):
EXEC Report_Invoice @Xml = N'<XML><Params Date="2022-07-05T00:00:00" /><Customer KeyId="19" /><company KeyId="1" /><Department KeyId="1" /><Office KeyId="1" /></XML>'
我已经提出了以下内容,但是我敢肯定我做错了。如何正确获得XML格式化?
CREATE OR ALTER PROCEDURE Report_Statement
@EndDate SMALLDATETIME = NULL,
@OfficeFilterBy INT = NULL,
@DepartmentFilterBy INT = NULL,
@companyFilterBy INT = NULL,
@CustomerIdFilterBy INT = NULL
AS
DECLARE @myXml Xml = (
SELECT
Params.[Date],
CustomerOffice.KeyId,
Department.KeyId,
company.KeyId,
Customer.KeyId
FROM
(SELECT 1 AS ID, @EndDate AS [Date]) AS Params
LEFT JOIN
(SELECT 1 AS ID, @OfficeFilterBy AS [KeyId]) CustomerOffice ON CustomerOffice.ID = Params.ID
LEFT JOIN
(SELECT 1 AS ID, @DepartmentFilterBy AS [KeyId]) Department ON Department.ID = Params.ID
LEFT JOIN
(SELECT 1 AS ID, @companyFilterBy AS [KeyId]) company ON company.ID = Params.ID
LEFT JOIN
(SELECT 1 AS ID, @CustomerIdFilterBy AS [KeyId]) Customer ON Customer.ID = Params.ID
FOR XML AUTO, TYPE, ROOT('XML'))
DECLARE @myXmlStr NVARCHAR(MAX) = CAST( @myXml AS NVARCHAR(MAX))
EXEC Report_Invoice @Xml = @myXmlStr
GO
测试执行:
DECLARE @cDate DATETIME = GETDATE()
EXECUTE [dbo].Report_Statement
@EndDate = @cDate,
@OfficeFilterBy = 1,
@DepartmentFilterBy = 2,
@companyFilterBy = 3,
@CustomerIdFilterBy = 4
生成此XML:
<XML>
<Params Date="2022-07-05T23:16:00">
<CustomerOffice KeyId="1">
<Department KeyId="2">
<company KeyId="3">
<Client KeyId="4" />
</company>
</Department>
</CustomerOffice>
</Params>
</XML>
I am trying to make a wrapper parameterised stored procedure to execute another stored procedure which takes XML as its input (for use with SSRS).
This is how the XML stored procedure is currently run (the @Xml
parameter is actually text type):
EXEC Report_Invoice @Xml = N'<XML><Params Date="2022-07-05T00:00:00" /><Customer KeyId="19" /><company KeyId="1" /><Department KeyId="1" /><Office KeyId="1" /></XML>'
I have come up with the following, but I'm sure I'm doing it wrong. How do I get the XML formatted properly?
CREATE OR ALTER PROCEDURE Report_Statement
@EndDate SMALLDATETIME = NULL,
@OfficeFilterBy INT = NULL,
@DepartmentFilterBy INT = NULL,
@companyFilterBy INT = NULL,
@CustomerIdFilterBy INT = NULL
AS
DECLARE @myXml Xml = (
SELECT
Params.[Date],
CustomerOffice.KeyId,
Department.KeyId,
company.KeyId,
Customer.KeyId
FROM
(SELECT 1 AS ID, @EndDate AS [Date]) AS Params
LEFT JOIN
(SELECT 1 AS ID, @OfficeFilterBy AS [KeyId]) CustomerOffice ON CustomerOffice.ID = Params.ID
LEFT JOIN
(SELECT 1 AS ID, @DepartmentFilterBy AS [KeyId]) Department ON Department.ID = Params.ID
LEFT JOIN
(SELECT 1 AS ID, @companyFilterBy AS [KeyId]) company ON company.ID = Params.ID
LEFT JOIN
(SELECT 1 AS ID, @CustomerIdFilterBy AS [KeyId]) Customer ON Customer.ID = Params.ID
FOR XML AUTO, TYPE, ROOT('XML'))
DECLARE @myXmlStr NVARCHAR(MAX) = CAST( @myXml AS NVARCHAR(MAX))
EXEC Report_Invoice @Xml = @myXmlStr
GO
Testing execution:
DECLARE @cDate DATETIME = GETDATE()
EXECUTE [dbo].Report_Statement
@EndDate = @cDate,
@OfficeFilterBy = 1,
@DepartmentFilterBy = 2,
@companyFilterBy = 3,
@CustomerIdFilterBy = 4
Produces this XML:
<XML>
<Params Date="2022-07-05T23:16:00">
<CustomerOffice KeyId="1">
<Department KeyId="2">
<company KeyId="3">
<Client KeyId="4" />
</company>
</Department>
</CustomerOffice>
</Params>
</XML>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不知道为什么您要使用XML传递参数(在不推荐使用的
文本
数据类型中),但看起来您只需要for xml Path
以及XQUERY每个列名的路径I have no idea why you are using XML to pass parameters (in the deprecated
text
datatype no less), but it looks like you just needFOR XML PATH
along with a XQuery path for each column namedb<>fiddle