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