创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。
语法
CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
        [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ] [ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ] 
参数
procedure_name新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。有关更多信息,请参见使用标识符。要创建局部临时过程,可以在 procedure_name 前面加一个编号符 (#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符 (##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。;number是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。@parameter过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。 data_type参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。 说明  对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
VARYING指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。default参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。OUTPUT表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。n表示最多可以指定 2.100 个参数的占位符。{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。说明  在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
FOR REPLICATION指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。AS指定过程要执行的操作。sql_statement过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。n是表示此过程可以包含多条 Transact-SQL 语句的占位符。

解决方案 »

  1.   

    http://chs.gotdotnet.com/quickstart/aspplus/doc/webdataaccess.aspx#storedprocs<%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.SqlClient" %><html>
     
    <script language="VB" runat="server">    Sub GetSales_Click(Sender As Object, E As EventArgs)         Dim DS As DataSet
            Dim MyConnection As SqlConnection
            Dim MyCommand As SqlDataAdapter        MyConnection = New SqlConnection("server=(local)\NetSDK;database=northwind;Trusted_Connection=yes")
            MyCommand = New SqlDataAdapter("Employee Sales By Country", MyConnection)        MyCommand.SelectCommand.CommandType = CommandType.StoredProcedure        MyCommand.SelectCommand.Parameters.Add(New SqlParameter("@Beginning_Date", SqlDbType.DateTime))
            MyCommand.SelectCommand.Parameters("@Beginning_Date").Value = BeginDate.SelectedDate        MyCommand.SelectCommand.Parameters.Add(New SqlParameter("@Ending_Date", SqlDbType.DateTime))
            MyCommand.SelectCommand.Parameters("@Ending_Date").Value = EndDate.SelectedDate        DS = new DataSet()
            MyCommand.Fill(DS, "销售额")        MyDataGrid.DataSource=DS.Tables("销售额").DefaultView
            MyDataGrid.DataBind()
        End Sub</script><body>  <form runat="server">    <h3><font face="宋体">对 DataGrid 控件的参数化存储过程选择</font></h3>    <table width="700">
          <tr>
            <td valign="top" >
              <b>开始日期</b>
              <ASP:Calendar id="BeginDate" 
                 BorderWidth="2"
                 BorderColor="lightblue"
                 Font-Size="8pt" 
                 TitleStyle-Font-Size="8pt" 
                 TitleStyle-BackColor="#cceecc" 
                 DayHeaderStyle-BackColor="#ddffdd"
                 DayHeaderStyle-Font-Size="10pt" 
                 WeekendDayStyle-BackColor="#ffffcc" 
                 SelectedDate="7/1/1996"
                 VisibleDate="7/1/1996"
                 SelectedDayStyle-BackColor="lightblue"
                 runat="server"/>
            </td>
            <td valign="top" >
              <b>结束日期</b>
              <ASP:Calendar id="EndDate" 
                 BorderWidth="2"
                 BorderColor="lightblue"
                 Font-Size="8pt" 
                 TitleStyle-Font-Size="8pt" 
                 TitleStyle-BackColor="#cceecc" 
                 DayHeaderStyle-BackColor="#ddffdd"
                 DayHeaderStyle-Font-Size="10pt" 
                 WeekendDayStyle-BackColor="#ffffcc" 
                 SelectedDate="7/25/1996"
                 VisibleDate="7/25/1996"
                 SelectedDayStyle-BackColor="lightblue"
                 runat="server"/>        </td>
            <td valign="top" style="padding-top:20">
              <input type="submit" OnServerClick="GetSales_Click" Value="获取员工销售额" runat="server"/><p>          
            </td>
          </tr>
          <tr>
            <td colspan="3" style="padding-top:20">
                <ASP:DataGrid id="MyDataGrid" runat="server"
                  Width="500"
                  BackColor="#ccccff" 
                  BorderColor="black"
                  ShowFooter="false" 
                  CellPadding=3 
                  CellSpacing="0"
                  Font-Name="宋体"
                  Font-Size="8pt"
                  HeaderStyle-BackColor="#aaaadd"
                  EnableViewState="false"
                />
            </td>
          </tr>
        </table>  </form></body>
    </html>
      

  2.   

    编写和使用存储过程 一般情况下,执行特殊查询是以牺牲性能为代价的。使用存储过程可以减少在应用程序中执行繁重的数据库操作的开销。存储过程易于创建,甚至可以通过 SQL 语句来实现。以下代码示例创建一个只返回表的存储过程。 
    CREATE Procedure GetAuthors AS
        SELECT * FROM Authors
        return
    GO可以创建同样接受参数的存储过程。例如: 
    CREATE Procedure LoadPersonalizationSettings (@UserId varchar(50)) AS
        SELECT * FROM Personalization WHERE UserID=@UserId
        return
    GO从 ASP.NET 页使用存储过程只是您迄今为止已经学习的 SqlCommand 对象知识的扩展。CommandText 只是存储过程的名称,而不是特殊查询文本。通过设置 CommandType 属性,向 SqlCommand 指出 CommandText 是存储过程。 
    myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
      

  3.   

    如果要直接使用数据命令对数据集执行命令,所执行的 SQL 语句或存储过程常常需要参数。例如,需要参数的简单“更新”(Update) 语句可能为如下样子:UPDATE Employees
    SET LastName = @LastName, FirstName = @FirstName, BirthDate = @BirthDate
    WHERE (EmployeeID = @Emp_id)
    当执行该语句时,必须为所有参数(@LastName、@FirstName、@BirthDate 和 @Emp_id)提供值。若要这样做,可使用参数对象。数据命令支持 Parameters 集合,它包含一组 OleDbParameter 类或 SqlParameter 类类型的对象。对于需要传递的每个参数,集合中均有一个对应的参数对象。此外,如果要调用存储过程,可能需要一个附加参数来接受过程的返回值。注意 如果正在使用数据集,通常不直接执行数据命令。而使用适配器特定的方法设置参数。有关更多信息,请参阅将参数用于 DataAdapter。
    可以使用“属性”窗口或代码配置命令的 Parameters 集合。有关使用“属性”窗口的更多信息,请参阅为数据适配器配置参数。有关如何以编程方式创建和配置参数的示例,请参阅将存储过程用于命令。提示 最好为您的参数对象命名,以便可以方便地在代码中引用它们。尽管可以使用参数对象在 Parameters 集合中的索引值来引用它,但通过名称引用更清楚也更不易出错。
    在执行命令以前,必须为命令中的每个参数设置值。设置参数值 对于命令的 Parameters 集合中的每个参数,将其 Value 属性设置为要传递的值。 
    下面的示例展示在执行引用存储过程的命令以前如何设置参数。本示例假定您已配置了具有 au_id、au_lname 和 au_fname 三个参数的 Parameters 集合。各个参数均通过名称设置,以清楚表明正在设置哪个参数。 ' Visual Basic
    ' The following two properties can be set in the Properties window
    ' but are shown here for completeness.
    With OleDbCommand1
       .CommandText = "UpdateAuthor"
       .CommandType = System.Data.CommandType.StoredProcedure
       .Parameters("au_id").Value = listAuthorID.Text
       .Parameters("au_lname").Value = txtAuthorLName.Text
       .Parameters("au_fname").Value = txtAuthorFName.Text
    End With
    OleDbConnection1.Open()
    OleDbCommand1.ExecuteNonQuery()
    OleDbConnection1.Close()// C#
    // The following two properties can be set in the Properties window
    // but are shown here for completeness.
    OleDbCommand1.CommandText = "UpdateAuthor";
    OleDbCommand1.CommandType = System.Data.CommandType.StoredProcedure;
    OleDbCommand1.Parameters["au_id"].Value = listAuthorID.Text;
    OleDbCommand1.Parameters["au_lname"].Value = txtAuthorLName.Text;
    OleDbCommand1.Parameters["au_fname"].Value = txtAuthorFName.Text;
    OleDbConnection1.Open();
    OleDbCommand1.ExecuteNonQuery();
    OleDbConnection1.Close();
    获取返回值
    存储过程常常将值传递回调用这些过程的应用程序。它们可以通过参数传递值或通过定义并传递返回值来完成该操作。获取过程返回的值 创建一些参数,将它们的 Direction 属性设置为 Output 或 InputOutput(如果该参数在过程中既用于接收值也用于发送值)。确保参数的数据类型与预期的返回值匹配。 
    执行过程后,读取所传递回参数的“值”(Value) 属性。 
    获取过程的返回值 创建一个参数,将其 Direction 属性设置为 ReturnValue。 
    注意 返回值的参数对象必须是 Parameters 集合中的第一项。
    确保参数的数据类型与预期的返回值匹配。 
    注意 “更新”(Update)、“插入”(Insert) 和“删除”(Delete) SQL 语句返回一个整数值,指示受该语句影响的记录数。可以 ExecuteNonQuery 方法的返回值的形式获取该值。有关更多信息,请参阅使用数据命令执行更新或数据库命令。
    下面的示例展示如何获取 CountAuthors 存储过程的返回值。在此情况下,假定该命令的 Parameters 集合中的第一个参数被命名为“retvalue”,用 ReturnValue 的一个方向配置。' Visual Basic
    Dim cntAffectedRecords As Integer
    ' The following two property settings can also me done 
    ' in the Properties window, but are shown here for completeness.
    OleDbcommand1.CommandText = "CountAuthors"
    OleDbCommand1.CommandType = CommandType.StoredProcedure
    OleDbConnection1.Open()
    OleDbCommand1.ExecuteNonQuery()
    OleDbConnection1.Close()
    cntAffectedRecords = CType(OleDbCommand1.Parameters("retvalue").Value, Integer)
    MessageBox.Show("Affected records = " & cntAffectedRecords.ToString)// C#
    int cntAffectedRecords;
    oleDbcommand1.CommandText = "CountAuthors";
    oleDbCommand1.CommandType = CommandType.StoredProcedure;
    oleDbConnection1.Open();
    oleDbCommand1.ExecuteNonQuery();
    oleDbConnection1.Close();
    cntAffectedRecords = (int)(OleDbCommand1.Parameters["retvalue"].Value);
    MessageBox.Show("Affected records = " + cntAffectedRecords.ToString());