none
SQL Server2012 报表中的Parameters空值 RRS feed

  • 问题

  • SQL Server2012 报表使用存储过程,并定义了参数,实现动态查询,在报表设计时能否在此参数为空时,任然可以根据存储过程中的判断条件,使用不同的SQL语句进行查询呢?目前只能把所有参数,如时间,区域名称,点位都设置后才能查询到数据,想要实现,当区域为空,点位为空查询数据,以及区域不为空,点位为空查询数据的功能?如何实现呢?参数“Allow null value”或者“Allow blank value”勾选上都不行
    2018年2月28日 16:26

全部回复

  • 可否将参数为空改成根据参数值来判断。

    例子,原来需要两个参

    create procedure Test(@a nvarchar(10), @b nvarchar(10)) {

      select *  from t where col1=@a and col2=@b

      }

    改成一个参数

    create procedure Test(@a nvarchar(10)) { 

      //将参数@a的值分解为 多个参数值

       declare a1,a2,a3 nvarchar(10);

       select  * from t where col1=@a1 and col2=a2 and col3=a3

    }

    原来是的传值@a='123', @b='xyz'或是@b=null

    现在的新的传值123,, 存储过程内部将参数@a的值分解为 多个参数值


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年3月1日 0:47
  • 在存储过程里面判断就行,你是遇到什么错误了?

    想不想时已是想,不如不想都不想。

    2018年3月1日 2:42
    版主
  • 谢谢你的回复。我在存储过程中写了如下代码

    ALTER PROCEDURE [dbo].[Proc_DataGet]
    	-- Add the parameters for the stored procedure here
    	@StartTime datetime, 
    	@Zone varchar(32),
    	@FTName varchar(32)
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	IF @Zone is not null
    	BEGIN
    		IF @FTName is not null
    		BEGIN
    			SELECT [Station_Name_CN]
    				,[Stream_Name_EN]
    				,Factory_Name
    				,Press
    				,Temperatur
    				,Voltage
    				,t_stamp
    			FROM vmHisData
    			where datepart(hh,t_stamp) between 0 and 8 
    			and datepart(yy,t_stamp)= year(@StartTime)
    			and datepart(mm,t_stamp)= month(@StartTime)
    			and datepart(dd,t_stamp)= day(@StartTime)
    			and Station_Name_CN = @Zone
    			and Stream_Name_EN  = @FTName
    			order by Stream_Name_EN asc,t_stamp asc
    		END
    		ELSE
    		BEGIN
    			SELECT [Station_Name_CN]
    				,[Stream_Name_EN]
    				,Factory_Name
    				,Press
    				,Temperatur
    				,Voltage
    				,t_stamp
    			FROM vmHisData
    			where datepart(hh,t_stamp) between 0 and 8 
    			and datepart(yy,t_stamp)= year(@StartTime)
    			and datepart(mm,t_stamp)= month(@StartTime)
    			and datepart(dd,t_stamp)= day(@StartTime)
    			and Station_Name_CN = @Zone
    			order by Stream_Name_EN asc,t_stamp asc
    		END
    	END
    	ELSE 
    	BEGIN
    		SELECT [Station_Name_CN]
    			  ,[Stream_Name_EN]
    			  ,Factory_Name
    			  ,Press
    			  ,Temperatur
    			  ,Voltage
    			  ,t_stamp
    		FROM vmHisData
    		where datepart(hh,t_stamp) between 0 and 8 
    		and datepart(yy,t_stamp)= year(@StartTime)
    		and datepart(mm,t_stamp)= month(@StartTime)
    		and datepart(dd,t_stamp)= day(@StartTime)
    		order by Stream_Name_EN asc,t_stamp asc
    	END
    		
    END

    然后在报表服务中使用了其中的参数@StartTime datetime, @Zone varchar(32),@FTName varchar(32),现在是要求即使@Zone varchar(32),@FTName varchar(32)为空也能根据上面的查询语句查到数据,或者其中@FTName varchar(32)为空也能查到数据

    当我其中一个为空不选择会有如下报警 :请为参数选择一个值



    2018年3月1日 2:46
  • ALTER PROCEDURE [dbo].[Proc_DataGet]
    -- Add the parameters for the stored procedure here
    @StartTime datetime,
    @Zone varchar(32) = NULL,
    @FTName varchar(32)
    AS

    用其它默认值也行


    想不想时已是想,不如不想都不想。

    2018年3月1日 9:23
    版主
  • 你是怎么调用报表的?

    想不想时已是想,不如不想都不想。

    2018年3月1日 9:25
    版主

  • 想不想时已是想,不如不想都不想。

    2018年3月1日 9:55
    版主