OUTPUT 指的是调用存储过程后,可以将在存储过程中取得的值通过此参数返回给调用者:如:sp:ba int output 我调b后,可以取得在b设置的参数a的值。而input为默认的传参数,只作为调用值传给存储过程。这两者可以类似于程序中的ref 和byvalue的对比,一个是传值,一个传址,传址的可以提到设置的值。output 相对于传址。

解决方案 »

  1.   

    Input是输入型参数!
    Output是输出型参数!由于存储过程除了返回查询结果以外可以返回一些值,这些值就是由这些标示为output的参数传递出去的。默认的都是input类型,就不多说了!
      

  2.   

    CREATE PROCEDURE sp_Accounts_CreateUser
    @EmailAddress varchar(255),
    @Password binary(20),
    @Address varchar(80),
    @HomePhone varchar(14),
    @UserName varchar(50),
    @UserID int output
    AS
    INSERT INTO Accounts_Users(EmailAddress, Password,Address,HomePhone, UserName)
    VALUES(@EmailAddress, @Password, @Address, @HomePhone, @UserName)

    SET @UserID = @@IDENTITY RETURN 1
    上面的存储过程创建一个新的账户,同时返回用户的编号给客户!如果你要是用Select则可以在Where里面使用参数!但是一般这种情况下不需要output因为它会返回一个结果集给客户的,我这里说的客户可以是所有调用存储过程的程序。下面则是这样的一个例子:
    CREATE PROCEDURE sp_Accounts_GetUserDetailsByName
    /*
    (
    @parameter1 datatype = default value,
    @parameter2 datatype OUTPUT
    )
    */
    /* SET NOCOUNT ON */
    @UserName varchar(40)
    AS
    SELECT * FROM Accounts_Users WHERE UserName = @UserName
      

  3.   

    Output是输出型参数
    使用前先要声明
      

  4.   

    楼上的,请问:
    如果INPUT型的用在WHERE后面作为条件,而前面SELECT 用 @参数1=参数1是什么意思?
      

  5.   

    里面使用了注释代码/*
    (
    @parameter1 datatype = default value,
    @parameter2 datatype OUTPUT
    )
    */
    /* SET NOCOUNT ON */
    希望没有影响你阅读,这是使用VS.NET创建存储过程的时候自动生成的!在.NET开发环境里面这样使用这个存储过程:
    public int Create(string userName,byte[] password,string emailAddress,string homePhone,string address){
             
             try{
                SqlParameter[] parameters = new SqlParameter[6];
                parameters[0] = new SqlParameter("@EmailAddress",emailAddress);
                parameters[1] = new SqlParameter("@Password",password);
                parameters[2] = new SqlParameter("@Address",address);
                parameters[3] = new SqlParameter("@HomePhone",homePhone);
                parameters[4] = new SqlParameter("@UserName",userName);
                parameters[5] = new SqlParameter("@UserID",SqlDbType.Int);
                parameters[5].Direction = ParameterDirection.Output;
                // 下面的方法请参考SqlHelper可以在微软的网站上的到相关信息!
                SqlHelper.ExecuteNonQuery("sp_Accounts_CreateUser",parameters);
                return (int)parameters[5].Value;
             }
             catch ( SqlException e ) {
                if (e.Number == 2601) {
                   return (int)SkySword.WebModules.Accounts.ProcResultCodes.AccountAlreadyOnFile;
                }
                else {
                   throw new AppException("在执行sp_Accounts_CreateUser存储过程的时候出错!",e );
                }
             }
          }
      

  6.   

    ==〉如果INPUT型的用在WHERE后面作为条件,而前面SELECT 用 @参数1=参数1是什么意思?
    是给@参数1付值,一般参数的名字和字段的名字一样所以会有上面这种情况!Select @a = a from test
    @a是参数!a是test里面的一个字段!
      

  7.   

    我在学习IBUYSPY PORTAL他的数据库复杂死了,实在找不到头绪!下面是里面的一段SP:你能给讲一下吗?
    ALTER  PROCEDURE GetPortalSettings
    (
        @PortalAlias   nvarchar(50),
        @TabID         int,
        @PortalID      int OUTPUT,
        @PortalName    nvarchar(128) OUTPUT,
        @AlwaysShowEditButton bit OUTPUT,
        @TabName       nvarchar (50)  OUTPUT,
        @TabOrder      int OUTPUT,
        @MobileTabName nvarchar (50)  OUTPUT,
        @AuthRoles     nvarchar (256) OUTPUT,
        @ShowMobile    bit OUTPUT
    )
    AS/* First, get Out Params */
    IF @TabID = 0 
        SELECT TOP 1
            @PortalID      = Portals.PortalID,
            @PortalName    = Portals.PortalName,
            @AlwaysShowEditButton = Portals.AlwaysShowEditButton,
            @TabID         = Tabs.TabID,
            @TabOrder      = Tabs.TabOrder,
            @TabName       = Tabs.TabName,
            @MobileTabName = Tabs.MobileTabName,
            @AuthRoles     = Tabs.AuthorizedRoles,
            @ShowMobile    = Tabs.ShowMobile    FROM
            Tabs
        INNER JOIN
            Portals ON Tabs.PortalID = Portals.PortalID
            
        WHERE
            PortalAlias=@PortalAlias
            
        ORDER BY
            TabOrderELSE 
        SELECT
            @PortalID      = Portals.PortalID,
            @PortalName    = Portals.PortalName,
            @AlwaysShowEditButton = Portals.AlwaysShowEditButton,
            @TabName       = Tabs.TabName,
            @TabOrder      = Tabs.TabOrder,
            @MobileTabName = Tabs.MobileTabName,
            @AuthRoles     = Tabs.AuthorizedRoles,
            @ShowMobile    = Tabs.ShowMobile    FROM
            Tabs
        INNER JOIN
            Portals ON Tabs.PortalID = Portals.PortalID
            
        WHERE
            TabID=@TabID/* Get Tabs list */
    SELECT  
        TabName,
        AuthorizedRoles,
        TabID,
        TabOrder
        
    FROM    
        Tabs
        
    WHERE   
        PortalID = @PortalID
        
    ORDER BY
        TabOrder
      

  8.   

    那在SQLCOMMAND.EXECUTEREADER()后怎么在程序中调用被赋值的参数呢?
      

  9.   

    Select和Set一样都可以付值,但是Select可以给参数付值某个字段!Set就不行!如果没有用where筛选记录则是最后一个记录的值给了参数1。
      

  10.   

    SqlHelper.ExecuteNonQuery("sp_Accounts_CreateUser",parameters);
    执行这个以后,那个输出型的参数就已经有值了!
    parameters[5].Value就是你要的值了!!
      

  11.   

    Input是输入参数.
    Output是输出参数.
    例如:
    触发器中:
    CREATE TRIGGER  Example1_2_UPDATE 
          ON     dbo.Example1_2 
     for update,update 
    as
    IF UPDATE(A) OR  UPDATE(B)
    declare @id int,@aa int,@bb int,@wzbm_A varchar(50),@@bmcbf varchar(50)
    set @wzbm_A='wzbm_A'
    set @bmcbf = 'Example1_2_BF'
    select @id =  LS_D.ID FROM Example1_2  AS MX,
           INSERTED         AS LS_I,
           DELETED          AS LS_D
           WHERE  MX.ID=LS_D.ID
    exec DMSCBFB @id,@wzbm_A,@bmcbf,@bb input--这就是调用的地方
    ================================
    存储过程中:
    CREATE procedure DMSCBFB
    @idh int,
    @wxw_bmlxa varchar(50),
    @bmcbf varchar(50),
    @aa1 int output -- 这就是输出的地方
    as
    select @parentobj2=id  from sysobjects where name=@bmc and xtype='U'
    declare sc_cursorw1 scroll cursor for  select distinct name,colid From syscolumns Where id=@parentobj2  ORDER BY colid asc --and name<>'id' 
    open sc_cursorw1 
    fetch next from sc_cursorw1 into @zdmc1,@zfcd
    while @@FETCH_STATUS=0       
    begin
             if @zdmc1<>'' or @zdmc1<>null
                        Exec ALTER_DROP_table @bmcbf,@zdsl,@zdsl2,@table_tem,@table_tem2,@pp output   --判断增减字段or修改字段类型长度等
    end
    Exec delete_table--删除临时表
    GO
      

  12.   

    input是输入参数,向存储过程传入的值,output是输出参数,当存储过程执行完后返回给客户端的值
      

  13.   

    HelenIsxingfang(啊文) 大哥,谢谢,不过扯远了!