如何在sql server select语句中编写if条件来创建存储过程

时间:2011-12-26 10:52:47

标签: sql-server-2008 dynamic-sql

我正在使用sql server2008(动态sql)编写一个存储过程,现在我的问题是我将4个值传递给存储过程,因为UserAgentID varchar(50)传递值或为空,现在我可以通过任何值如(1233)基于显示值,我现在传递空,如('')基于显示的字段空值,但我正在使用表Agentid是整数数据类型所以我传递 IS NULL 如何写条件基础,我正在尝试这样

ALTER Procedure [dbo].[usp_GetSearch123]      
(      
 @SearchValue varchar(100),      
 @SearchBy varchar(250),
 @DbName varchar(50),
 @UserAgentID varchar(50)     
)     
AS    
Begin

  Declare @cmd varchar(5000)

  select @cmd = 
  'Select QT.Name,SC.Name as Status,QT.QuoteNumber,QT.SubmissionNumber,QT.UnderWriter as UnderWriter,LC.Name as LineCode,QT.DBAName as DBAName         
  from Agent_Quote QT,Users US,' + @DbName + '..StatusCode SC, ' + @DbName+'..Linecode LC      
  where QT.StatusCode = SC.StatusCode And QT.LineCode = LC.LineCode and SC.StatusCode!=''C'' and US.UserID=QT.CreatedBy and US.AgentID like'''+@UserAgentID+''' and     
  (QT.Name like ''' + @SearchValue + '%'' or QT.DBAName like ''' + @SearchValue +'%'')       
  order by QT.Name,QuoteNumber desc'
print @cmd
  exec(@cmd)
 end

现在我在用户表空值中传递空,那么如何编写条件请帮助我任何一个... 感谢你 hemanth

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

IF ISNULL(@UserAgentID, -1) = -1
  select @cmd = 
  'Select QT.Name,SC.Name as Status,QT.QuoteNumber,QT.SubmissionNumber,
  QT.UnderWriter as UnderWriter,LC.Name as LineCode,QT.DBAName as DBAName         
  from Agent_Quote QT,Users US,' + @DbName + '..StatusCode SC, ' + @DbName+'..Linecode LC      
  where QT.StatusCode = SC.StatusCode And QT.LineCode = LC.LineCode and 
  SC.StatusCode!=''C'' and US.UserID=QT.CreatedBy and 


  US.AgentID is nulll and     


  (QT.Name like ''' + @SearchValue + '%'' or QT.DBAName like ''' + @SearchValue +'%'')     


  order by QT.Name,QuoteNumber desc'
else
  select @cmd = 
  'Select QT.Name,SC.Name as Status,QT.QuoteNumber,QT.SubmissionNumber,
  QT.UnderWriter as UnderWriter,LC.Name as LineCode,QT.DBAName as DBAName         
  from Agent_Quote QT,Users US,' + @DbName + '..StatusCode SC, ' + @DbName+'..Linecode LC      
  where QT.StatusCode = SC.StatusCode And QT.LineCode = LC.LineCode and 
  SC.StatusCode!=''C'' and US.UserID=QT.CreatedBy and 


  US.AgentID like'''+@UserAgentID+''' and     


  (QT.Name like ''' + @SearchValue + '%'' or QT.DBAName like ''' + @SearchValue +'%'')       
  order by QT.Name,QuoteNumber desc'

  select @cmd = 
  'Select QT.Name,SC.Name as Status,QT.QuoteNumber,QT.SubmissionNumber,
  QT.UnderWriter as UnderWriter,LC.Name as LineCode,QT.DBAName as DBAName         
  from Agent_Quote QT,Users US,' + @DbName + '..StatusCode SC, ' + @DbName+'..Linecode LC      
  where QT.StatusCode = SC.StatusCode And QT.LineCode = LC.LineCode and 
  SC.StatusCode!=''C'' and US.UserID=QT.CreatedBy and 


  ((@UserAgentID is null AND US.AgentID is null) OR US.AgentID like'''+@UserAgentID+''') and     


  (QT.Name like ''' + @SearchValue + '%'' or QT.DBAName like ''' + @SearchValue +'%'')       
  order by QT.Name,QuoteNumber desc'

答案 1 :(得分:0)

问题有点令人困惑,但如果它以AgentID问题为中心,我将做出以下假设:

1)表中的AgentID的数据类型为int

2)您在AgentID列中也有NULL值

因此,您将该变量作为字符串传递(您不应该这样做,保持数据类型一致并传入0或其他无效的id值),您可以尝试按以下方式执行您的AgentID条件:

--First, create int prameter and validate the @UserAgentID parameter
DECLARE @AgentID int
SELECT @AgentID = 0
IF ISNUMERIC(@UserAgentID)=1
BEGIN
SELECT @AgentID = CAST(@UserAgentID AS int)
END

--update your @UserAgentID condition statement as follows
    ... and ISNULL(US.AgentID,0) = '+CAST(@AgentID AS nvachar(10))+' and 

...

如果您的agentid是varchar类型列,则以下内容应该有效...

... and ISNULL(US.AgentID,'') like ''' + ISULL(@UserAgentID,'') + ''' and

同样,条件语句和数据类型让我在这里(对于ID列需要“LIKE”?)但希望这会引导您朝着正确的方向前进。

HTH

戴夫

相关问题