我想做一个存储过程,要传入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作为查询条件?
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作为查询条件?
@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--代码未测试
--仅提供参考思路
begin
@sql += or JobCode=@JobCode
end
exec @sql
@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 行
找不到存储过程 ''。什么情况??? 有人没?
set @Where =@Where + ' and JobCode='''+@JobCode+''''
if(@SDOC_NO!='')
set @Where =@Where + ' and SDOC_NO='''+@SDOC_NO+''''
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 声明后没有初始化,字符串和一个没有初始化的变量相加,结果就是空。懂?
我把sql语句打印出来? 那怎么执行?要作为参数输出,接收在执行吗?
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。
只是调试的时候用的。
名称 '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 ' 不是有效的标识符。