我正在使用SQL Server 2008R2和SSRS 2010.我正在测试一个使用if语句在两个简单SQL语句之一的执行之间切换的存储过程。我的最终目标是使用存储过程替换嵌入在多个SSRS报告中的SQL,该存储过程根据日期参数选择要运行的语句。
我测试了SSMS中的语句,它在语句之间切换并产生没有问题的结果。但是,在SSRS中,当我执行报告并测试第二个语句时,除了计算文本列,我的结果集为空。如果我从SSRS查询设计器运行相同的proc,则执行的语句之间的切换工作
任何人都可以帮助我理解为什么在执行报告时交换机不起作用?这是我正在使用的SQL:
begin
if @reportdate >='10/1/2014' goto convformat
if @reportdate <'10/1/2014' goto preconvformat
end
preconvformat:
SELECT TOP (1000) col1
,col2
,col3
,col4
,col5
,col6
,col7
,'t1' AS OriginalDataSource
FROM t1 AS arh WITH (NOLOCK)
LEFT JOIN t1a1 a WITH (NOLOCK)
ON a.col1 = arh.col1
WHERE (arh.DateCreated < '1/1/2015')
and a.col2 = '12345678'
goto testend
convformat:
SELECT TOP 1000 arcus.col1
,col2
,col3
,col4
,col5
,col6
,col7
,'t3' AS OriginalDataSource
FROM t3. rmrtrk WITH (NOLOCK)
LEFT JOIN t3t1 arcus WITH (NOLOCK)
ON arcus.col1 = rmrtrk.col1
where customer_number = '12345678'
testend:
答案 0 :(得分:0)
创建一个过程并使用ANSI Date格式来比较传递的日期值..
同样避免使用GOTO
,在较大的代码段中调试非常困难。使用IF..ELSE
构造。
CREATE PROCEDURE Test_Proc
@reportdate DATE
AS
BEGIN
SET NOCOUNT ON;
IF (@reportdate >= '20141001') --<-- ANSI Date Format YYYYMMDD
BEGIN
-- 1st Statement
END
ELSE
BEGIN
-- 2nd Statement
END
END
答案 1 :(得分:0)
我刚刚意识到问题所在。最初,我打算使用union语句,其中第二个语句被过滤并与第一个语句合并。
当我改变方法时,我忘了为第二个语句使用别名。这就是SSRS结果集为空的原因。
微米。阿里,谢谢你的贡献。我会根据您的反馈做出适当的更改。