在我的报告服务数据集的SQL查询中,我希望能够使用以下模式:
-- Used to enable/disable diagnostic statements
declare @DEBUG bit
set @DEBUG = 0
-- Get current date/time.
declare @now datetime; set @now = getdate()
if @DEBUG = 1 select @now as now
-- Create a table to contain the chart values for the last 30 days.
declare @reportValues table
(
reportDate datetime,
x int
)
-- Populate the table with the last 30 days.
declare @counter int; set @counter = 0
while @counter < 5
begin
insert into @reportValues select dateadd( day, -@counter, @now ), @counter
set @counter = @counter + 1
end
if @DEBUG = 1 select * from @reportValues
select sum(x) as total from @reportValues
问题是,Reporting Services忽略了IF语句,并为报告的值而不是主查询“选择@now as now”。
有没有办法实现这种模式来解决这个RS限制?
更新:如果您转到"SET FMTONLY" help page on the MSDN,有人已在页面底部的评论中注明了此问题,并且关闭此选项可解决此问题。
答案 0 :(得分:2)
列集是否随@debug而变化?
如果数据库是SQL Server,您可以尝试使用fmtonly kludge:
declare @fmtonlyon bit
select @fmtonlyon = 0
if 1 = 0 select @fmtonlyon = 1
if @fmtonlyon = 1 set fmtonly off
/* query body */
if @fmtonlyon = 1 set fmtonly on
强制进行全面评估。在你的情况下可能会或可能不会工作。
或者,用PRINT替换调试SELECT语句。
答案 1 :(得分:0)
最好在存储过程中编写查询并从RS调用sproc,而不必依赖RS对文本查询的解释。然后,您应该能够传递@Debug
参数并毫无问题地进行检查。
编辑:请尝试此操作,看看它是否识别出If语句 -
-- Used to enable/disable diagnostic statements
declare @DEBUG bit
set @DEBUG = 0
-- Get current date/time.
declare @now datetime; set @now = getdate()
IF @DEBUG = 1
BEGIN
select @now as now
END
ELSE
BEGIN
select * from ... -- Main query elided
END
编辑#2 :由于以上似乎没有帮助,我的下一个建议是尝试类似SELECT CASE(这假设你只是拉一列并调用它“现在“):
-- Used to enable/disable diagnostic statements
declare @DEBUG bit
set @DEBUG = 0
-- Get current date/time.
declare @now datetime; set @now = getdate()
SELECT
CASE @Debug
WHEN 1 THEN @now
WHEN 0 THEN (Perform Your Select Inside These Parentheses)
END as now