我想做一个存储过程,要传入7个参数,7个作为查询条件   例如:
create proc proc_InsepctedPrductSerach
@JobCode varchar(50),
@SDOC_NO varchar(50),
@MATNR varchar(50),
@OperatorUserID varchar(50),
@P_SERIAL_NO varchar(50),
@BeginTime varchar(50),
@EndTime varchar(50)
as
select ID,SERIAL_NO,P_SERIAL_NO,JobCode,SDOC_NO,SDOC_GPID,PACK_GPID,
           MATNR,CodeDesc,ProductType,VersionPCS,ImportTime,
ImportDeptID,FinalCompleteTime,
            OperatorUserID,RET_FLAG,DEL_FLAG,Status
            from InspectedProduct
where   JobCode=@JobCode or SDOC_NO like '%'+@SDOC_NO+'%' or
MATNR like '%'+@MATNR+'%'or OperatorUserID=@OperatorUserID or
P_SERIAL_NO like '%'+@P_SERIAL_NO+'%' or
(ImportTime>=@BeginTime and ImportTime<=@EndTime)
go现在问题是,JobCode为空查不出数据 我该怎么做才能在JobCode为空的情况下不将JobCode作为查询条件?

解决方案 »

  1.   

    create proc proc_InsepctedPrductSerach
    @JobCode varchar(50),
    @SDOC_NO varchar(50),
    @MATNR varchar(50),
    @OperatorUserID varchar(50),
    @P_SERIAL_NO varchar(50),
    @BeginTime varchar(50),
    @EndTime varchar(50)
    declare @sql nvarchar(8000)
    as
    set @sql=select ID,SERIAL_NO,P_SERIAL_NO,JobCode,SDOC_NO,SDOC_GPID,PACK_GPID,
      MATNR,CodeDesc,ProductType,VersionPCS,ImportTime,
    ImportDeptID,FinalCompleteTime,
      OperatorUserID,RET_FLAG,DEL_FLAG,Status
      from InspectedProduct
      where SDOC_NO like '%'+@SDOC_NO+'%' or
    MATNR like '%'+@MATNR+'%'or OperatorUserID=@OperatorUserID or
    P_SERIAL_NO like '%'+@P_SERIAL_NO+'%' or
    (ImportTime>=@BeginTime and ImportTime<=@EndTime
    if(@@JobCode <> '')
    begin
     @sql += or  JobCode=@JobCode
    endgo--代码未测试
    --仅提供参考思路
      

  2.   

    if(@JobCode <> '')
    begin
     @sql += or  JobCode=@JobCode
    end
    exec @sql
      

  3.   

    create proc proc_InsepctedPrductSerach @JobCode varchar(50),
    @SDOC_NO varchar(50),
    @MATNR varchar(50),
    @OperatorUserID varchar(50),
    @P_SERIAL_NO varchar(50),
    @BeginTime varchar(50),
    @EndTime varchar(50)
    as
    begin
    declare @sql nvarchar(4000)
    declare @Where nvarchar(4000)if(@JobCode!='')
    set @Where =@Where + ' and JobCode='+@JobCode
    if(@SDOC_NO!='')
    set @Where  =@Where + ' and SDOC_NO='+@SDOC_NO
    if(@MATNR!='')
    set @Where  =@Where + ' and MATNR='+@MATNR
    if(@OperatorUserID!='')
    set @Where =@Where + ' and OperatorUserID='+@OperatorUserID
    if(@P_SERIAL_NO!='')
    set @Where =@Where + ' and P_SERIAL_NO='+@P_SERIAL_NO
    if(@BeginTime!='' and @EndTime!='')
    set @Where  =@Where + ' and ImportTime>='+@BeginTime+' and ImportTime<='+@EndTime set @sql='select ID,SERIAL_NO,P_SERIAL_NO,JobCode,SDOC_NO,SDOC_GPID,PACK_GPID,
               MATNR,CodeDesc,ProductType,VersionPCS,ImportTime,
    ImportDeptID,FinalCompleteTime,
                OperatorUserID,RET_FLAG,DEL_FLAG,Status
                from InspectedProduct where 1=1 ' +@Where
    exec @sql
    end
    goexec proc_InsepctedPrductSerach 
    '2','','','','','',''
    消息 2812,级别 16,状态 62,过程 proc_InsepctedPrductSerach,第 33 行
    找不到存储过程 ''。什么情况???   有人没?
      

  4.   

    if(@JobCode!='')
        set @Where =@Where + ' and JobCode='''+@JobCode+''''
    if(@SDOC_NO!='')
        set @Where  =@Where + ' and SDOC_NO='''+@SDOC_NO+''''
      

  5.   

    哥们。你的SQL语句是空的。加Print把关键的变量打印出来。
      

  6.   

    go 
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[proc_InsepctedPrductSerach]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [dbo].[proc_InsepctedPrductSerach]
    go 
    create proc proc_InsepctedPrductSerach    @JobCode varchar(50),
        @SDOC_NO varchar(50),
        @MATNR varchar(50),
        @OperatorUserID varchar(50),
        @P_SERIAL_NO varchar(50),
        @BeginTime varchar(50),
        @EndTime varchar(50)
    as
    begin
    declare @sql nvarchar(4000)
    declare @Where nvarchar(4000)set @Where=''    --look here!!!!!!!!!  do like thisif(@JobCode!='')
        set @Where =@Where + ' and JobCode='+@JobCode
    if(@SDOC_NO!='')
        set @Where  =@Where + ' and SDOC_NO='+@SDOC_NO
    if(@MATNR!='')
        set @Where  =@Where + ' and MATNR='+@MATNR
    if(@OperatorUserID!='')
        set @Where =@Where + ' and OperatorUserID='+@OperatorUserID
    if(@P_SERIAL_NO!='')
        set @Where =@Where + ' and P_SERIAL_NO='+@P_SERIAL_NO
    if(@BeginTime!='' and @EndTime!='')
        set @Where  =@Where + ' and ImportTime>='+@BeginTime+' and ImportTime<='+@EndTime    set @sql='select ID,SERIAL_NO,P_SERIAL_NO,JobCode,SDOC_NO,SDOC_GPID,PACK_GPID,
               MATNR,CodeDesc,ProductType,VersionPCS,ImportTime,
                ImportDeptID,FinalCompleteTime,
                OperatorUserID,RET_FLAG,DEL_FLAG,Status
                from InspectedProduct where 1=1 ' +@Where
    print @sql
        --exec @sql
    end
    goexec proc_InsepctedPrductSerach 
    '2','','','','','',''这是正解。加这一句set @Where=''    --look here!!!!!!!!!  do like this
    主要你的@where 声明后没有初始化,字符串和一个没有初始化的变量相加,结果就是空。懂?
      

  7.   


    我把sql语句打印出来? 那怎么执行?要作为参数输出,接收在执行吗?
      

  8.   

    if(@BeginTime!='' and @EndTime!='')
        set @Where  =@Where + ' and ImportTime>='+@BeginTime+' and ImportTime<='+@EndTime    set @sql='select ID,SERIAL_NO,P_SERIAL_NO,JobCode,SDOC_NO,SDOC_GPID,PACK_GPID,
               MATNR,CodeDesc,ProductType,VersionPCS,ImportTime,
                ImportDeptID,FinalCompleteTime,
                OperatorUserID,RET_FLAG,DEL_FLAG,Status
                from InspectedProduct where 1=1 ' +@Where
        print @sql
        exec @sql
    end
    go
    先加Print @sql
    打印出来,看看SQL语句构造的是否正确,如果正确的话再把Pirnt语句删掉,直接exec @sql。
      

  9.   

    Print @sql
    只是调试的时候用的。
      

  10.   

    语句正确,就是没办法执行消息 203,级别 16,状态 2,过程 proc_InsepctedPrductSerach,第 35 行
    名称 'select ID,SERIAL_NO,P_SERIAL_NO,JobCode,SDOC_NO,SDOC_GPID,PACK_GPID,
               MATNR,CodeDesc,ProductType,VersionPCS,ImportTime,
                ImportDeptID,FinalCompleteTime,
                OperatorUserID,RET_FLAG,DEL_FLAG,Status
                from InspectedProduct where 1=1 ' 不是有效的标识符。
      

  11.   

    exec(@sql)动态SQL 要这样执行