使用 WITH XMLNAMESPACES 的 s-s-rS 查询不返回数据集
Posted
技术标签:
【中文标题】使用 WITH XMLNAMESPACES 的 s-s-rS 查询不返回数据集【英文标题】:s-s-rS query using WITH XMLNAMESPACES not returning dataset 【发布时间】:2016-09-12 22:14:15 【问题描述】:我为 s-s-rS 报告编写的 sql 查询在 SSMS 中完美执行,但在 s-s-rS 报告中运行时无法返回结果。报表服务器或数据库服务器上没有错误。 s-s-rS 报告呈现但不包含数据。
我尝试运行 SQL 探查器,但查询根本不显示。我在服务器上还有其他几个运行正常的报告,并且查询出现在 SQL 探查器中。
损坏的报告中唯一不同的是我正在使用 ;WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3')
查询 XML 数据
我在 SQL Server 2005 和 2008 上运行时得到相同的结果
这里是查询,关于为什么在 s-s-rS 中运行时什么都不返回的任何想法。我已修改查询以删除/修改可能导致语法错误的客户端信息,但未修改的查询在 SSMS 中运行并返回结果
Declare @MinDate datetime;
Declare @MaxDate datetime;
DECLARE @fooData TABLE (msgId varchar(100), TransactionName varchar(30),SourceSystem varchar(12),MsgDay date)
;WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3')
INSERT INTO @fooData
SELECT
MsgLogID as msgId
,TransactionName =
CASE LEFT(MsgBody,28)
--WHEN '<qqqResult' THEN 'qqqResult'
WHEN '<qqqResult xmlns=' THEN 'qqqResult'
ELSE 'qqqqRevised'
END
, SourceSystem =
CASE LEFT(MsgBody,21)
--WHEN '<qqqResult' THEN CONVERT(XML,[MsgBody]).value('(/qqqResult/receiver/device/id/@extension)[1]','varchar(1000)')
WHEN '<qqqResult' THEN CONVERT(XML,[MsgBody]).value('(/qqqResult/sender/device/id/@extension)[1]','varchar(1000)')
ELSE CONVERT(XML,[MsgBody]).value('(/qqqRevised/sender/device/id/@extension)[1]','varchar(1000)')
END
, Convert(date,[MsgDateTime]) as MsgDay
FROM [foo].[dbo].[fooMegerPerson_WCF]
WHERE [TransactionStatus] = 'Valid'
SELECT @MaxDate=DATEADD(DAY,0,datediff(day,0, MAX([MsgDateTime]))) ,@MinDate=DATEADD(DAY,0,datediff(day,0, MIN ([MsgDateTime])) )FROM [foo].[dbo].[fooMegerPerson_WCF]
-- Declare a temp table for the query msg type so that we can create a join
DECLARE @msgNameTable TABLE (msgName varchar(30))
INSERT INTO @msgNameTable (msgName)
Values ('qqqResult'),('fooRevised')
DECLARE @sourceTable TABLE (sourceName varchar(10))
INSERT INTO @sourceTable (sourceName)
Values ('foo_1'),('foo_2')
--Select * from @msgNameTable
-- create a date table containing every day between start and end
DECLARE @datetable TABLE (d date)
INSERT INTO @datetable
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1) Date = DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY a.object_id) - 1,
@MinDate)
FROM sys.all_objects a CROSS JOIN
sys.all_objects b
-- cross join to create a daily entry for every msg type and every source system
DECLARE @dateNameSourceTable TABLE (d date, msgName varchar (30),sourceName varchar(10))
INSERT INTO @dateNameSourceTable
Select dt.d, mn.msgName, st.sourceName from @datetable dt CROSS JOIN @msgNameTable mn CROSS JOIN @sourceTable st
--SELECT * FROM @dateNameSourceTable
Select Count(x.msgId) AS MessageCount,dsn.msgName AS TransactionName ,dsn.d, dsn.sourceName
FROM @fooData as X
RIGHT JOIN @dateNameSourceTable dsn ON x.MsgDay = dsn.d AND x.SourceSystem = dsn.sourceName AND x.TransactionName = dsn.msgName
Group By dsn.d, dsn.msgName, dsn.sourceName
Order By dsn.d, dsn.sourceName , dsn.msgName
【问题讨论】:
嗨,这个问题解决了吗?您需要进一步的帮助吗? 【参考方案1】:破碎的报告中唯一不同的是我是 使用 ;WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3') 查询 XML 数据
嗯,这是非常重要的唯一的事情...
DECLARE @XML XML=
'<root><a>test</a></root>';
SELECT @XML.value('(/root/a)[1]','nvarchar(max)')
按预期返回“测试”
WITH XMLNAMESPACES(DEFAULT 'tmpUri')
SELECT @XML.value('(/root/a)[1]','nvarchar(max)')
返回“NULL”
虽然
DECLARE @XML XML=
'<root xmlns="tmpUri"><a>test</a></root>';
WITH XMLNAMESPACES(DEFAULT 'tmpUri')
SELECT @XML.value('(/root/a)[1]','nvarchar(max)')
返回“test”,但没有命名空间提示的相同将返回“NULL”...
省略所有命名空间有一个通用技巧:使用通配符!
SELECT @XML.value('(/*:root/*:a)[1]','nvarchar(max)')
【讨论】:
感谢命名空间提示。我最终使用命名空间通配符从头开始重建报告,它可以工作以上是关于使用 WITH XMLNAMESPACES 的 s-s-rS 查询不返回数据集的主要内容,如果未能解决你的问题,请参考以下文章
next-with-apollo,s-s-r 不起作用,请求在客户端完成
如何在 Angular 5 (s-s-r with Universal) 中使用 Google Analytics 功能?
注册类型为InstancePerRequest with Exception(s)
S40-with-theme jar 文件中的 io 类支持哪个 jar 文件