存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列 SQL 语句。
可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。 

解决方案 »

  1.   

    触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或 DELETE。触发器可以查询其它表,而且可以包含复杂的 SQL 语句。它们主要用于强制复杂的业务规则或要求。例如,可以控制是否允许基于顾客的当前帐户状态插入定单。触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。有关详细信息,请参见表关系。使用触发器的优点
    触发器的优点如下: 触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
    触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。
    触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。例如,触发器可以回滚试图对价格低于 10 美元的书(存储在 titles 表中)应用折扣(存储在 discounts 表中)的更新。 
      

  2.   

    -- =============================================
    -- Create trigger basic template(After trigger)
    -- =============================================
    IF EXISTS (SELECT name 
       FROM   sysobjects 
       WHERE  name = N'<trigger_name, sysname, trig_test>' 
       AND    type = 'TR')
        DROP TRIGGER <trigger_name, sysname, trig_test>
    GOCREATE TRIGGER <trigger_name, sysname, trig_test>
    ON <table_name, sysname, pubs.dbo.sales>
    FOR DELETE, INSERT, UPDATE 
    AS 
    BEGIN
    RAISERROR (50009, 16, 10)
    END
    GO
      

  3.   

    -- =============================================
    -- Create procedure basic template
    -- =============================================
    -- creating the store procedure
    IF EXISTS (SELECT name 
       FROM   sysobjects 
       WHERE  name = N'<procedure_name, sysname, proc_test>' 
       AND    type = 'P')
        DROP PROCEDURE <procedure_name, sysname, proc_test>
    GOCREATE PROCEDURE <procedure_name, sysname, proc_test> 
    <@param1, sysname, @p1> <datatype_for_param1, , int> = <default_value_for_param1, , 0>, 
    <@param2, sysname, @p2> <datatype_for_param2, , int> = <default_value_for_param2, , 0>
    AS
    SELECT @p1, @p2
    GO-- =============================================
    -- example to execute the store procedure
    -- =============================================
    EXECUTE <procedure_name, sysname, proc_test> <value_for_param1, , 1>, <value_for_param2, , 2>
    GO
      

  4.   

    现答的实例问题:
    我的数据库有400万的记录:
    id   bdn_id    stat
    ------------------------
    id:自动缯长的,在提取时还用不到
    bdn_id:要提取的数据,有的是7位,有的是8位,有的9位...,我在delphi中写了个小程序,输入8,100000(10万),那么只提取8位的,10万个数,把他写入文本文件中,并使stat变为1
    stat:一个标记,没有提取的是0,提取后变为1
    如何写才速度快且不死机呢?每次提都是10多万的--存储过程.
    create proc p_export
    @位数 int, --要导出数据的位数
    @条数 int, --导出的条数
    @filename varchar(1000), --导出文件的:目录名+文件名
    @username varchar(200)='', --用户名,如果用NT验证方式,则为空''
    @password varchar(200)='' --密码
    as
    declare @sql varchar(8000)
    --导出处理
    set @sql='bcp "select top '+cast(@条数 as varchar)
    +' bdn_id,stat from 表 where len(bdn_id)='
    +cast(@位数 as varchar)+'" queryout'
    +' "'+@filename+'" /c' +' /S"'+@@servername
    +case when isnull(@username,'')='' then '' 
    else '" /U"'+@username end
    +'" /P"'+isnull(@password,'')+'"'
    exec master..xp_cmdshell @sql,no_output--设置标志
    set @sql='update 表 set stat=1 where id in(select top '
    +cast(@条数 as varchar)+' id from 表 where len(bdn_id_='
    +cast(@位数 as varchar)
    exec(@sql)
    go--调用示例
    exec p_export 8,10000,'c:\a.txt'