使用 WITH XMLNAMESPACES 的 SSRS 查询不返回数据集

SSRS query using WITH XMLNAMESPACES not returning dataset

我为 SSRS 报告编写的 sql 查询在 SSMS 中完美执行,但在 SSRS 报告中 运行 时无法 return 结果。报表服务器或数据库服务器上没有错误。 SSRS 报告呈现但不包含任何数据。 我尝试了 运行ning SQL 探查器,但查询根本没有出现。我在服务器上还有其他几个报告 运行 正确并且查询出现在 SQL 分析器中。 损坏报告中唯一不同的是我正在使用 ;WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3')

查询 XML 数据

我在 运行ning 与 SQL Server 2005 和 2008

上得到了相同的结果

这是查询,关于为什么在 SSRS 中 运行 时没有 returned 的任何想法。我已将查询修改为 remove/modified 客户端信息,这可能会导致语法错误,但未修改的查询 运行s 和 returns 结果是 运行 在 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

The only thing that is different in the broken report is that I am querying XML data using ;WITH XMLNAMESPACES(DEFAULT 'urn:hl7-org:v3')

嗯,这是非常重要的唯一的事情...

DECLARE @XML XML=
'<root><a>test</a></root>';

SELECT @XML.value('(/root/a)[1]','nvarchar(max)')

returns "test" 符合预期

WITH XMLNAMESPACES(DEFAULT 'tmpUri')
SELECT @XML.value('(/root/a)[1]','nvarchar(max)')

returns "NULL"

同时

DECLARE @XML XML=
'<root xmlns="tmpUri"><a>test</a></root>';

WITH XMLNAMESPACES(DEFAULT 'tmpUri')
SELECT @XML.value('(/root/a)[1]','nvarchar(max)')

returns "test" 但是没有命名空间提示的情况会 return "NULL"...

省略所有命名空间的通用技巧是:使用通配符!

SELECT @XML.value('(/*:root/*:a)[1]','nvarchar(max)')