可以这样,存储过程的参数仍然使用两个参数,调用的时候,可以传递NULL值,例如:EXECUTE au_info  'firstname',NULL
--或者
EXECUTE au_info  NULL,'lastname'然后,你再修改一下存储过程,在存储过程中判断一下参数是否为NULL,如果有一个为NULL,则不搜索该参数,如果两个都不为NULL,则搜索两个字段都满足的记录.
这样你在以后的使用过程中,也会方便一些.

解决方案 »

  1.   

    如果一定要用一个参数,就将存储过程改成如下:  CREATE PROCEDURE au_info  
         @name varchar(40)
      AS  
      SELECT au_lname, au_fname, title, pub_name 
        FROM authors a INNER JOIN titleauthor ta 
         ON a.au_id = ta.au_id INNER JOIN titles t 
         ON t.title_id = ta.title_id INNER JOIN publishers p 
         ON t.pub_id = p.pub_id 
        WHERE au_fname = @name
         OR au_lname = @name 
      GO 但是这样的话,你想同时搜索两个字段就没办法了
      

  2.   

    下面的方法当 EXECUTE au_info  'firstname' 执行时,可以成功,但是此时'lastname'只能加到@lastname上,所以想要 @firstname 复制,只能EXECUTE au_info null, 'lastname'这样CREATE PROCEDURE au_info  
        @lastname varchar(40)=null,  
        @firstname varchar(20)=null 
      AS  
      SELECT au_lname, au_fname, title, pub_name 
        FROM authors a INNER JOIN titleauthor ta 
         ON a.au_id = ta.au_id INNER JOIN titles t 
         ON t.title_id = ta.title_id INNER JOIN publishers p 
         ON t.pub_id = p.pub_id 
        WHERE au_fname = @firstname 
         AND au_lname = @lastname 
      

  3.   

    都不能满足我的要求啊。其实就跟拼sql语句一样。如果某个条件不输入,就不在where里面加入条件。比如在不使用存储过程的时候,把sql语句写成:
    string strsql = " select * from table where ";if(lastname != "")
        strsql = strsql + lastname;if(firstname != "")
       strsql = strsql + firstname;
    这样的功能我想在存储过程中实现,请问怎么实现?
      

  4.   

    在存储过程中做个判断,然后分别使用不同的SQL.if @par1 is not null and @par2 is not null
       ............
    else 
       if @par1 is not null and @par2 is null
       .......................
       else
          if ....
      

  5.   

    很简单.我假设,你存储过程的两个参数为 @p1,@p2那么依具你存储过程中的写法,也有不同的写法.--1,若是采用动态语句
    declare @sql varchar(1000)
    set @sql='select * from tb where 1=1 '
    if @p1 is not null
      set @sql=@sql + ' and field1=' + @p1
    if @p2 is not null
      set @sql=@sql + ' and field2=' + @p2--2,若是采用的非动态语句select * from tb 
      where field1=case when @p1 is null then field1 else @p1 end
           and field2=case when @p2 is null then field2 else @p2 end
      

  6.   

    create procedure test_pro
    (
    @p1 varchar(20) = null,
    @p2 varchar(20) = null
    )
    as
    begin
    ......
    end
    只要在建存储过程的时候,参数是有设定默认值,则在执行存储过程的时候可以不传入参数。此时若只想传p2,可以
    test_pro @p2 = 'hello'大家可以试下
      

  7.   

    CREATE PROCEDURE au_info 
    @lastname varchar(40)=null,
    @firstname varchar(20)=null
    AS 
    SELECT au_lname, au_fname, title, pub_name
    FROM authors a INNER JOIN titleauthor ta
    ON a.au_id = ta.au_id INNER JOIN titles t
    ON t.title_id = ta.title_id INNER JOIN publishers p
    ON t.pub_id = p.pub_id
    WHERE au_fname = isnull(@firstname,au_fname)
    AND au_lname = isnull(@lastname,au_lname)
    GO