当前位置: 代码迷 >> Sql Server >> 一个带2个参数的存储过程,如果执行的时候只输入一个参数,该怎么办?有代码
  详细解决方案

一个带2个参数的存储过程,如果执行的时候只输入一个参数,该怎么办?有代码

热度:37   发布时间:2016-04-27 15:28:13.0
一个带2个参数的存储过程,如果执行的时候只输入一个参数,该怎么处理?有代码
USE pubs
  IF EXISTS (SELECT name FROM sysobjects 
       WHERE name = \'au_info\' AND type = \'P\')
    DROP PROCEDURE au_info
  GO
  USE pubs
  GO
  CREATE PROCEDURE au_info 
    @lastname varchar(40), 
    @firstname varchar(20) 
  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
  GO
  
  au_info 存储过程可以通过以下方法执行:  
  EXECUTE au_info \'Dull\', \'Ann\'

执行该存储过程的时候必须2个参数都要填写。但是我有一个需求就是:我只输入一个参数,这个存储过程该怎么改?即我执行的时候,[email protected]@lastname

------解决方案--------------------
可以这样,存储过程的参数仍然使用两个参数,调用的时候,可以传递NULL值,例如:
SQL code
EXECUTE au_info  'firstname',NULL--或者EXECUTE au_info  NULL,'lastname'
------解决方案--------------------
如果一定要用一个参数,就将存储过程改成如下:
SQL code
  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     ORageCount
------解决方案--------------------
下面的方法当 EXECUTE au_info 'firstname' 执行时,可以成功,[email protected],所以想要 @firstname 复制,只能EXECUTE au_info null, 'lastname'这样
SQL code
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
------解决方案--------------------
很简单.我假设,你存储过程的两个参数为 @p1,@p2

那么依具你存储过程中的写法,也有不同的写法.

SQL code
--1,若是采用动态语句declare @sql varchar(1000)set @sql='select * from tb where 1=1 'if @p1 is not null  set @[email protected] + ' and field1=' + @p1if @p2 is not null  set @[email protected] + ' 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
------解决方案--------------------
SQL code
CREATE PROCEDURE au_infoge
  相关解决方案