存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。 可以出于任何使用 SQL 语句的目的来使用存储过程,它具有以下优点: 可以在单个存储过程中执行一系列 SQL 语句。
可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。
可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。
触发器的优点如下: 触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
触发器可以通过数据库中的相关表进行层叠更改。例如,可以在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。
触发器可以强制限制,这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其它表中的列。例如,触发器可以回滚试图对价格低于 10 美元的书(存储在 titles 表中)应用折扣(存储在 discounts 表中)的更新。
-- 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
-- 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
我的数据库有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'