我先来一个,总结了好久,觉得这么写效果不错。希望大家给点建议
ALTER PROCEDURE [dbo].[ap_intranetDHCPGetByIPAddressNameMacSel]
(
@IPAddress nvarchar (255)  ,
@Name nvarchar (255) , 
@Mac nvarchar (255) 
)
AS

   SELECT dhcpID,
[IPAddress],
[Name],
[Description],
[Mac],
[Switch],
[Port],
[AdminSvc],
[InternalSvc],
[ExternalSvc]
FROM intranetdhcpWHERE (([IPAddress] like '%'+@IPAddress+'%') or (@IPAddress=''))
and ([Name]like '%'+@Name+'%' or @Name='')
 and ([Mac] like '%'+@Mac+'%' or @Mac='') order by [IPAddress]

解决方案 »

  1.   

    这玩意似乎发错地方。怎么不去sql版?但还是关注.
      

  2.   

    declare @sql char(1000)
     set @sql = 'select * from tablename where 1=1'
     if condition1 
       set @sql=@sql+ 'and column1=?'
     if condition2 
       set @sql=@sql+ 'and column2=?'
     .....
     Exec(@sql)
      

  3.   

    要是效率低的话有没有什么更好的方法呢?请大家说说
    to henreash(虫子) 你这个方法如果数据库管理员将exec 屏蔽了估计就没戏了。我们单位的数据库就不让执行存储过程中的 exec方法!
      

  4.   

    ALTER PROCEDURE dbo.SP_STATISTICS_LOGINMOST
    (
    @tablename varchar,
    @dateStart datetime,
    @dateEnd datetime
    )
    AS
    declare @sqlcmd varchar(1000)

    set @sqlcmd = 'select top 5 from 
    (select count * from ' + @tablename + 'where convert(varchar(10),[登录时间],121)>=''' +convert(varchar(10),@dateStart,121)+ ''' and convert(varchar(10),[退出时间],121)<=''' + convert(varchar(10),@dateEnd,121) + '''group by 号码)'  exec(@sqlcmd)
    FROM 附近有错误……为什么呀 刚写来试的

    RETURN
      

  5.   

    select count(0) from table1if exists (select 1 from table1)
      

  6.   

    从字面意思来判断的话,不明白为什么IPAddress的参数要用LIKE '%...%'来判断不能直接用 = 么?或者 LIKE '...%',因为如果你要搜"1.2",最后搜出个"3.1.2",甚至"31.24",我怎么想都觉得别扭我看过某个网页,里面说,LIKE '%...%' 这个语法,查询分析器(Query Analyzer)是无法优化的,所以要尽量避免(但是整篇文章都没说 LIKE '...%'不能优化)然后,将判断输入参数是否为空的表达式提到or的前面,
    也就是 (@IPAddress='') or ([IPAddress] like '%'+@IPAddress+'%')
    这样,如果参数为空,就不需要去看读出来的数据了,会快一些当然也不排除Query Analyzer已经非常智能地将只需要看内存的表达式先算好的可能性
      

  7.   

    据我所知, like'%%'这样的写法在查询的过程中是不使用索引的, 但是like'...%'等写法却可以使用, 所以like'%%'能不用就不用, 比如可以分析需求后用like'...%'的形式代替,, 但是, 其实很多时候我们都需要全字段查找, 这下怎么办?? 如果没有替代方式, 我认为大家不能看到like'%%'就说深恶痛绝吧? 至少也给个解决方案啊?另外就 netmicro(麦) 说的 (@IPAddress='') or ([IPAddress] like '%'+@IPAddress+'%'), 我觉得倒是挺有理的, 我觉得 ([IPAddress] like '%'+@IPAddress+'%') or (@IPAddress='')在前者用了like'%%'的情况下, 即使不用or (@IPAddress='') 也能完成同样多条件效果, 注意前提是前者用了like'%%'这种写法...不知道我说得对不?
      

  8.   

    “我觉得 ([IPAddress] like '%'+@IPAddress+'%') or (@IPAddress='')在前者用了like'%%'的情况下, 即使不用or (@IPAddress='') 也能完成同样多条件效果, 注意前提是前者用了like'%%'这种写法...不知道我说得对不?”问题是,@IPAddress='' 的判断用时,应该比 [IPAddress] LIKE '%%' 的判断用时短很多
    而且因为是 OR 相连,在左边的条件成立的时候,右边就不用看了
    所以提到“优化”,当然是把@IPAddress=''加上并且放在前面好
      

  9.   

    2 netmicro(麦) 我理解你的意思.我的意思是, 如果把 @IPAddress='' 放在后面, 还不如去掉 @IPAddress=''.
      

  10.   

    正确的书写格式应该是这样的:ALTER PROCEDURE [dbo].[ap_intranetDHCPGetByIPAddressNameMacSel]
    (
      @IPAddress nvarchar (255)  ,
      @Name nvarchar (255) , 
      @Mac nvarchar (255) 
    )
    AS
    SELECT
      dhcpID,
      [IPAddress],
      [Name],
      [Description],
      [Mac],
      [Switch],
      [Port],
      [AdminSvc],
      [InternalSvc],
      [ExternalSvc]
    FROM
      intranetdhcp
    WHERE
      (
         ([IPAddress] like '%'+ @IPAddress + '%') or
         (@IPAddress='')
      ) and
      ([Name]like '%'+@Name+'%' or @Name='') and
      ([Mac] like '%'+@Mac+'%' or @Mac='')
    order by
      [IPAddress]
      

  11.   

    @IPAddress = ''
    ==========
    空参数为什么不用null呢?
    @IPAddress is null
      

  12.   

    对了 用了null之后,你的where条件可以改写为这样:
    WHERE
      IsNull(@IPAddress, IPAddress) = IPAddress And
      IsNull(@Name, Name) = Name and
      IsNull(@Mac, Mac) = Mac我也看出来了,你这样写是想在查询的时候不用拼SQL。
    用我的方法吧,我早就这样用了。
      

  13.   

    给楼上:'' 和 NULL 不相等如果从文本框(Win or Web)输入条件,还要判断if str.Length == 0 then null else str的话还不如直接在SQL就写空字符串另外,要达到“模糊查询”(LIKE %...%),你IsNull的语法就埋没了这个功能了
      

  14.   

    @IPAddress = ''
    ==========
    空参数为什么不用null呢?
    @IPAddress is null_____________________________
    如果用isnull, 可能前面还要加一句 if @IPAddress = '' set @IPAddress = null
      

  15.   

    用''的确是方便,
    但''与null的意义是不同的:
    null表示没有输入,''表示输入了值为''
    所以用null更容易理解,并且除字符型字段外其它为空的字段必须转换null应该在调用时用DBNull.Value传给参数,而不是在sp中加:
    if @IPAddress = '' set @IPAddress = null另外Isnull()还是有漏洞的,也无法达到模糊查询。
    但IPAddress,Name, Mac之类感觉上并不需要用到模糊查询
      

  16.   

    答zxkid(失去了爱的感觉), 之所以要用'', 我想楼上已经解释过了, 就是在文本框输入的时候, 我不用在程序里面去写类似 if ISDBNULL(textboxNNN.Text.trim()) Then SomeFunction(null) else textboxNNN.Text.trim()) 之类的话, 写上if @IPAddress = '' set @IPAddress = null相当于把这个逻辑放到SP中.我认为于应用程序逻辑更加简单, 因为很多语言里 '' 和 null 可以被视为同一概念的, 没必要因为DB的缘故把这一逻辑在程序员那里打破, 请指教?
      

  17.   

    注意"'' 和 null 可以被视为同一概念的", 此处的null指字符串为空, 不是字符串对象不存在.