Tag: 存储过程预览模式: 普通 | 列表

Delphi与SQL存储过程

Delphi代码
  1. 存 储 过  程  
  2.   
  3. 1.创建存储过程  
  4. 创建存储过程主要用SQL语句Create PROCEDURE来实现,并用“Exec语句+存储过程名”来执行已创建的存储过程。  
  5. 本示例是用存储过程来执行多表合并的操作。  
  6. 操作步骤如下:  
  7. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit和TDBGrid等组件。  
  8. 2)主要程序代码如下:  
  9.   with ADOQuery1 do  
  10.   begin  
  11.     Close;  
  12.     SQL.Clear;  
  13.     SQL.add('create procedure '+Edit1.Text);    //创建存储过程  
  14.     SQl.Add('as ');  
  15.     SQL.Add('select k.学生编号,k.学生姓名,j.外语 FROM tb_stu AS k INNER JOIN tb_mark AS j ON k.学生编号 = j.学生编号 Where (((k.学生编号)=[j].[学生编号]))');  
  16.     ExecSQL;  
  17.     SQL.Clear;  
  18.     SQL.Add('Exec '+Edit1.Text);    //执行存储过程  
  19.     Open;  
  20.   end;  
  21.     
  22.     
  23. 2.对存储过程进行加密  
  24. 在创建存储过程时,可以为存储过程加密,这样用户可以隐藏存储过程的文本,避免其他用户在存储过程属性中查看其语句,主要用WITH ENCRYPTION选项实现。在对存储过程加密前必须对已有的存储过程进行删除。  
  25. 下面用存储过程的WITH ENCRYPTION选项来创建一个加密存储过程。  
  26. 操作步骤如下:  
  27. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton、TEdit、TMemo和TDBGrid等组件。  
  28. 2)主要程序代码如下:  
  29.   with ADOQuery1 do  
  30.   begin  
  31.     close;  
  32.     SQL.Clear;  
  33.     SQL.Add('if EXISTS(Select name FROM sysobjects Where name='+QuotedStr(Trim(Edit1.Text))+' AND type = ''p'')');    //判断存储过程是否存在  
  34.     SQL.Add('Drop PROCEDURE '+Trim(Edit1.Text));    //删除已有的存储过程  
  35.     EXECSQL;  
  36.     close;  
  37.     SQL.Clear;  
  38.     //为存储过程加密  
  39.     SQL.Add('Create PROCEDURE '+Edit1.Text+' WITH ENCRYPTION AS '+Trim(Memo1.Text));  
  40.     EXECSQL;  
  41.   end;  
  42.     
  43.     
  44. 3.用存储过程附加数据库  
  45. 使用存储过程附加数据库可以方便地将没有连接的数据库附加到当前服务器上,只是在附加数据库前先将存储过程所在的数据库以手动方式附加到服务器上。附加数据库主要用系统存储过程sp_attach_db来实现。在存储过程中不可以用占位符N。  
  46. 下面用存储过程将服务器以外的数据库附加到服务器上,只适用于英文数据库名。  
  47. 操作步骤如下:  
  48. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton和TEdit等组件。  
  49. 2)主要程序代码如下:  
  50. 创建一个含有参数的存储过程。  
  51.   with ADOQuery1 do  
  52.   begin  
  53.     close;  
  54.     SQL.Clear;  
  55.     SQL.Add('Create PROCEDURE '+Trim(Edit4.Text));  
  56.     SQL.Add('@Table varchar(20),');  
  57.     SQL.Add('@date varchar(200),');  
  58.     SQL.Add('@LOG varchar(200)');  
  59.     SQL.Add('AS');  
  60.     SQL.Add('EXEC sp_attach_db @dbname=@Table,@filename1=@date,@filename2 =@LOG');  
  61.     EXECSQL;  
  62.   end  
  63. 执行带参数的存储过程。  
  64.   with ADOQuery1 do  
  65.   begin  
  66.     close;  
  67.     SQL.Clear;  
  68.     SQL.Add('if EXISTS(Select name FROM sysobjects Where name='+QuotedStr(Trim(Edit4.Text))+' AND type = ''p'')');    //判断存储过程是否存在  
  69.     //以传参的形式调用存储过程  
  70.     SQL.Add('EXEC '+Trim(Edit4.Text)+' @Table='+QuotedStr(Trim(Edit1.Text))+',@date='+QuotedStr(Trim(Edit2.Text))+ ',@LOG='+QuotedStr(Trim(Edit3.Text)));  
  71.     EXECSQL;  
  72.   end;  
  73.     
  74.     
  75. 4.用存储过程备份数据库  
  76. 备份数据库与附加数据库所用的方法基本相同,只是备份数据库用SQL语句BACKUP DATABASE来实现,而附加数据库则用系统存储过程sp_attach_db来实现。  
  77. 下面利用存储过程对服务器上的任意数据库进行备份。  
  78. 操作步骤如下:  
  79. 1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TDataSource、TButton和TEdit等组件。  
  80. 2)主要程序代码如下:  
  81. 创建一个含有参数的存储过程。  
  82.   with ADOQuery1 do  
  83.   begin  
  84.     close;  
  85.     SQL.Clear;  
  86.     SQL.Add('Create PROCEDURE '+Trim(Edit3.Text));  
  87.     SQL.Add('@name varchar(20),');  
  88.     SQL.Add('@way varchar(200)');  
  89.     SQL.Add('AS');  
  90.     SQL.Add('backup database @name to disk=@way');  
  91.     EXECSQL;  
  92.     Showmessage('存储过程'+Edit3.Text+'创建成功。');  
  93.   end  
  94. 执行存储过程备份数据库。  
  95.   with ADOQuery1 do  
  96.   begin  
  97.     close;  
  98.     SQL.Clear;  
  99.     SQL.Add('if EXISTS(Select name FROM sysobjects Where name='+QuotedStr(Trim(Edit3.Text))+' AND type = ''p'')');    //判断存储过程是否存在  
  100.     //以传参的形式调用存储过程  
  101.     SQL.Add('EXEC '+Trim(Edit3.Text)+' @name='+Trim(ComboBox1.Text)+',@way='+QuotedStr(Trim(Edit2.Text)));  
  102.     EXECSQL;  
  103.   end;  

Tags: SQL 存储过程 Delphi

分类:Delphi | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 34
SQL代码
  1. Create procedure SpaceUsed  
  2. as  
  3. begin  
  4. declare @id int -- The object id of @objname.  
  5. declare @type character(2) -- The object type.  
  6. declare @pages int -- Working variable for size calc.  
  7. declare @dbname sysname  
  8. declare @dbsize dec(15,0)  
  9. declare @logsize dec(15)  
  10. declare @bytesperpage dec(15,0)  
  11. declare @pagesperMB dec(15,0)  
  12. declare @objname nvarchar(776) -- The object we want size on.  
  13. declare @updateusage varchar(5) -- Param. for specifying that  
  14. create table #temp1  
  15. (  
  16. 表名 varchar(200) null,  
  17. 行数 char(11) null,  
  18. 保留空间 varchar(15) null,  
  19. 数据使用空间 varchar(15) null,  
  20. 索引使用空间 varchar(15) null,  
  21. 未用空间 varchar(15) null  
  22. )  
  23. --select @objname='N_dep' -- usage info. should be updated.  
  24. select @updateusage='false'  
  25. /*Create temp tables before any DML to ensure dynamic  
  26. ** We need to create a temp table to do the calculation.  
  27. ** reserved: sum(reserved) where indid in (0, 1, 255)  
  28. ** data: sum(dpages) where indid < 2 + sum(used) where indid = 255 (text)  
  29. ** indexp: sum(used) where indid in (0, 1, 255) - data  
  30. ** unused: sum(reserved) - sum(used) where indid in (0, 1, 255)  
  31. */  
  32. declare cur_table cursor for  
  33. select name from sysobjects where type='u'  
  34. Open cur_table  
  35. fetch next from cur_table into @objname  
  36. While @@FETCH_STATUS=0  
  37. begin  
  38. create table #spt_space  
  39. (  
  40. rows int null,  
  41. reserved dec(15) null,  
  42. data dec(15) null,  
  43. indexp dec(15) null,  
  44. unused dec(15) null  
  45. )  
  46. /*  
  47. ** Check to see if user wants usages updated.  
  48. */  
  49. if @updateusage is not null  
  50. begin  
  51. select @updateusage=lower(@updateusage)  
  52. if @updateusage not in ('true','false')  
  53. begin  
  54. raiserror(15143,-1,-1,@updateusage)  
  55. return(1)  
  56. end  
  57. end  
  58. /*  
  59. ** Check to see that the objname is local.  
  60. */  
  61. if @objname IS NOT NULL  
  62. begin  
  63. select @dbname = parsename(@objname, 3)  
  64. if @dbname is not null and @dbname <> db_name()  
  65. begin  
  66. raiserror(15250,-1,-1)  
  67. return (1)  
  68. end  
  69. if @dbname is null  
  70. select @dbname = db_name()  
  71. /*  
  72. ** Try to find the object.  
  73. */  
  74. select @id = null  
  75. select @id = id, @type = xtype  
  76. from sysobjects  
  77. where id = object_id(@objname)  
  78. /*  
  79. ** Does the object exist?  
  80. */  
  81. if @id is null  
  82. begin  
  83. raiserror(15009,-1,-1,@objname,@dbname)  
  84. return (1)  
  85. end  
  86. if not exists (select * from sysindexes  
  87. where @id = id and indid < 2)  
  88. if @type in ('P ','D ','R ','TR','C ','RF'--data stored in sysprocedures  
  89. begin  
  90. raiserror(15234,-1,-1)  
  91. return (1)  
  92. end  
  93. else if @type = 'V ' -- View => no physical data storage.  
  94. begin  
  95. raiserror(15235,-1,-1)  
  96. return (1)  
  97. end  
  98. else if @type in ('PK','UQ'-- no physical data storage. --?!?! too many similar messages  
  99. begin  
  100. raiserror(15064,-1,-1)  
  101. return (1)  
  102. end  
  103. else if @type = 'F ' -- FK => no physical data storage.  
  104. begin  
  105. raiserror(15275,-1,-1)  
  106. return (1)  
  107. end  
  108. end  
  109. /*  
  110. ** Update usages if user specified to do so.  
  111. */  
  112. if @updateusage = 'true'  
  113. begin  
  114. if @objname is null  
  115. dbcc updateusage(0) with no_infomsgs  
  116. else  
  117. dbcc updateusage(0,@objname) with no_infomsgs  
  118. print ' '  
  119. end  
  120. set nocount on  
  121. /*  
  122. ** If @id is nullthen we want summary data.  
  123. */  
  124. /* Space used calculated in the following way  
  125. ** @dbsize = Pages used  
  126. ** @bytesperpage = d.low (where d = master.dbo.spt_values) is  
  127. ** the # of bytes per page when d.type = 'E' and  
  128. ** d.number = 1.  
  129. ** Size = @dbsize * d.low / (1048576 (OR 1 MB))  
  130. */  
  131. if @id is null  
  132. begin  
  133. select @dbsize = sum(convert(dec(15),size))  
  134. from dbo.sysfiles  
  135. where (status & 64 = 0)  
  136. select @logsize = sum(convert(dec(15),size))  
  137. from dbo.sysfiles  
  138. where (status & 64 <> 0)  
  139. select @bytesperpage = low  
  140. from master.dbo.spt_values  
  141. where number = 1  
  142. and type = 'E'  
  143. select @pagesperMB = 1048576 / @bytesperpage  
  144. select database_name = db_name(),  
  145. database_size =  
  146. ltrim(str((@dbsize + @logsize) / @pagesperMB,15,2) + ' MB'),  
  147. 'unallocated space' =  
  148. ltrim(str((@dbsize -  
  149. (select sum(convert(dec(15),reserved))  
  150. from sysindexes  
  151. where indid in (0, 1, 255)  
  152. )) / @pagesperMB,15,2)+ ' MB')  
  153. print ' '  
  154. /*  
  155. ** Now calculate the summary data.  
  156. ** reserved: sum(reserved) where indid in (0, 1, 255)  
  157. */  
  158. insert into #spt_space (reserved)  
  159. select sum(convert(dec(15),reserved))  
  160. from sysindexes  
  161. where indid in (0, 1, 255)  
  162. /*  
  163. ** data: sum(dpages) where indid < 2  
  164. ** + sum(used) where indid = 255 (text)  
  165. */  
  166. select @pages = sum(convert(dec(15),dpages))  
  167. from sysindexes  
  168. where indid < 2  
  169. select @pages = @pages + isnull(sum(convert(dec(15),used)), 0)  
  170. from sysindexes  
  171. where indid = 255  
  172. update #spt_space  
  173. set data = @pages  
  174. /* indexsum(used) where indid in (0, 1, 255) - data */  
  175. update #spt_space  
  176. set indexp = (select sum(convert(dec(15),used))  
  177. from sysindexes  
  178. where indid in (0, 1, 255))  
  179. - data  
  180. /* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */  
  181. update #spt_space  
  182. set unused = reserved  
  183. - (select sum(convert(dec(15),used))  
  184. from sysindexes  
  185. where indid in (0, 1, 255))  
  186. select reserved = ltrim(str(reserved * d.low / 1024.,15,0) +  
  187. ' ' + 'KB'),  
  188. data = ltrim(str(data * d.low / 1024.,15,0) +  
  189. ' ' + 'KB'),  
  190. index_size = ltrim(str(indexp * d.low / 1024.,15,0) +  
  191. ' ' + 'KB'),  
  192. unused = ltrim(str(unused * d.low / 1024.,15,0) +  
  193. ' ' + 'KB')  
  194. from #spt_space, master.dbo.spt_values d  
  195. where d.number = 1  
  196. and d.type = 'E'  
  197. end  
  198. /*  
  199. ** We want a particular object.  
  200. */  
  201. else  
  202. begin  
  203. /*  
  204. ** Now calculate the summary data.  
  205. ** reserved: sum(reserved) where indid in (0, 1, 255)  
  206. */  
  207. insert into #spt_space (reserved)  
  208. select sum(reserved)  
  209. from sysindexes  
  210. where indid in (0, 1, 255)  
  211. and id = @id  
  212. /*  
  213. ** data: sum(dpages) where indid < 2  
  214. ** + sum(used) where indid = 255 (text)  
  215. */  
  216. select @pages = sum(dpages)  
  217. from sysindexes  
  218. where indid < 2  
  219. and id = @id  
  220. select @pages = @pages + isnull(sum(used), 0)  
  221. from sysindexes  
  222. where indid = 255  
  223. and id = @id  
  224. update #spt_space  
  225. set data = @pages  
  226. /* indexsum(used) where indid in (0, 1, 255) - data */  
  227. update #spt_space  
  228. set indexp = (select sum(used)  
  229. from sysindexes  
  230. where indid in (0, 1, 255)  
  231. and id = @id)  
  232. - data  
  233. /* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */  
  234. update #spt_space  
  235. set unused = reserved  
  236. - (select sum(used)  
  237. from sysindexes  
  238. where indid in (0, 1, 255)  
  239. and id = @id)  
  240. update #spt_space  
  241. set rows = i.rows  
  242. from sysindexes i  
  243. where i.indid < 2  
  244. and i.id = @id  
  245. insert into #temp1  
  246. select name = object_name(@id),  
  247. rows = convert(char(11), rows),  
  248. reserved = ltrim(str(reserved * d.low / 1024.,15,0) +  
  249. ' ' + 'KB'),  
  250. data = ltrim(str(data * d.low / 1024.,15,0) +  
  251. ' ' + 'KB'),  
  252. index_size = ltrim(str(indexp * d.low / 1024.,15,0) +  
  253. ' ' + 'KB'),  
  254. unused = ltrim(str(unused * d.low / 1024.,15,0) +  
  255. ' ' + 'KB')  
  256. from #spt_space, master.dbo.spt_values d  
  257. where d.number = 1  
  258. and d.type = 'E'  
  259. Drop table #spt_space  
  260. end  
  261. fetch next from cur_table into @objname  
  262. end  
  263. Close cur_table  
  264. DEALLOCATE cur_table  
  265. Select * from #temp1 order by len(数据使用空间) desc,数据使用空间 desc,保留空间 desc  
  266. Drop table #temp1  
  267. return (0)  
  268. end  
  269. GO   
  270. 详细出处参考:http://www.jb51.net/article/6788.htm  

Tags: SQL 存储过程 空间

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 74

SQL2000存储过程的基础

SQL代码
  1.  
  2. 存储过程的概念  
  3.        SQL Server提供了一种方法,它可以将一些固定的操作集中起来由SQL Server数据库服务器来完成,以实现某个任务,这种方法就是存储过程。  
  4.        存储过程是SQL语句和可选控制流语句的预编译集合,存储在数据库中,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。  
  5.        在SQL Server中存储过程分为两类:即系统提供的存储过程和用户自定义的存储过程。  
  6.   
  7.        可以出于任何使用SQL语句的目的来使用存储过程,它具有以下优点:  
  8.        可以在单个存储过程中执行一系列SQL语句。  
  9.        可以从自己的存储过程内引用其他存储过程,这可以简化一系列复杂语句。  
  10.        存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快,而且减少网络通信的负担。  
  11.        安全性更高。  
  12. 创建存储过程  
  13.   
  14.        在SQL Server中,可以使用三种方法创建存储过程 :  
  15.          ①使用创建存储过程向导创建存储过程。  
  16.          ②利用SQL Server 企业管理器创建存储过程。  
  17.          ③使用Transact-SQL语句中的Create PROCEDURE命令创建存储过程。  
  18.   
  19. 下面介绍使用Transact-SQL语句中的Create PROCEDURE命令创建存储过程  
  20.     创建存储过程前,应该考虑下列几个事项:  
  21.      ①不能将 Create PROCEDURE 语句与其它 SQL 语句组合到单个批处理中。  
  22.      ②存储过程可以嵌套使用,嵌套的最大深度不能超过32层。  
  23.      ③创建存储过程的权限默认属于数据库所有者,该所有者可将此权限授予其他用户。  
  24.      ④存储过程是数据库对象,其名称必须遵守标识符规则。  
  25.      ⑤只能在当前数据库中创建存储过程。  
  26.      ⑥ 一个存储过程的最大尺寸为128M。  
  27.   
  28. 使用Create PROCEDURE创建存储过程的语法形式如下:  
  29.   
  30.   
  31. QUOTE:  
  32. Create PROC[EDURE]procedure_name[;number][;number]  
  33. [{@parameter data_type}  
  34. [VARYING][=default][OUTPUT]  
  35. ][,...n] WITH     
  36. {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]  
  37. [FOR REPLICATION]  
  38. AS sql_statement [ ...n ]  
  39.   
  40. Create PROCEDURE创建存储过程的语法参数的意义如下:  
  41.   
  42. procedure_name:用于指定要创建的存储过程的名称。  
  43. number:该参数是可选的整数,它用来对同名的存储过程分组,以便用一条 Drop PROCEDURE 语句即可将同组的过程一起除去。  
  44. @parameter:过程中的参数。在 Create PROCEDURE 语句中可以声明一个或多个参数。  
  45. data_type:用于指定参数的数据类型。  
  46. VARYING:用于指定作为输出OUTPUT参数支持的结果集。  
  47. Default:用于指定参数的默认值。  
  48. OUTPUT:表明该参数是一个返回参数。  
  49.   
  50.   
  51. 例如:下面创建一个 简单的存储过程productinfo,用于检索产品信息。  
  52. USE Northwind  
  53. if exists(select name from sysobjects  
  54.           where name='productinfo' and type = 'p')  
  55.    drop procedure productinfo  
  56. GO  
  57.   
  58. create  procedure productinfo  
  59. as  
  60. select * from products  
  61. GO  
  62. 通过下述sql语句执行该存储过程:execute productinfo  
  63. 即可检索到产品信息。  
  64.   
  65. 执行存储过程  
  66.   
  67. 直接执行存储过程可以使用EXECUTE命令来执行,其语法形式如下:  
  68. [[EXEC[UTE]]  
  69.    {       [@return_status=]  
  70.           {procedure_name[;number]|@procedure_name_var}            [[@parameter=]{value|@variable[OUTPUT]|[DEFAULT]}        
  71.       [,...n]  
  72. WITH RECOMPILE ]  
  73.   
  74. 使用 EXECUTE 命令传递单个参数,它执行 showind 存储过程,以 titles 为参数值。showind 存储过程需要参数 (@tabname),它是一个表的名称。其程序清单如下:  
  75.     EXEC showind titles  
  76. 当然,在执行过程中变量可以显式命名:  
  77.     EXEC showind @tabname = titles  
  78. 如果这是 isql 脚本或批处理中第一个语句,则 EXEC 语句可以省略:  
  79.     showind titles或者showind @tabname = titles  
  80.   
  81. 下面的例子使用了默认参数  
  82. USE Northwind  
  83. GO  
  84. Create PROCEDURE insert_Products_1  
  85.         ( @SupplierID_2         int,  
  86.          @CategoryID_3         int,  
  87.                  @ProductName_1 nvarchar(40)='无')  
  88. AS Insert INTO Products  
  89.          (ProductName,SupplierID,CategoryID)  
  90. VALUES  
  91.         (@ProductName_1,@SupplierID_2,@CategoryID_3)  
  92. GO  
  93. exec insert_Products_1 1,1  
  94. Select * from Products where SupplierID=1 and CategoryID=1  
  95. GO  
  96.   
  97.   
  98. 下面的例子使用了返回参数  
  99. USE Northwind  
  100. GO  
  101. Create PROCEDURE query_products  
  102. (      @SupplierID_1 int,  
  103.         @ProductName_2 nvarchar(40) output)  
  104. AS  
  105. select @ProductName_2 = ProductName   from products  
  106. where SupplierID = @SupplierID_1  
  107.   
  108. 执行该存储过程来查询SupplierID为1的产品名:  
  109. declare @product nvarchar(40)  
  110. exec query_products 1,@product output  
  111. select '产品名'= @product  
  112. go  
  113.   
  114.   
  115. 查看存储过程  
  116.    存储过程被创建之后,它的名字就存储在系统表sysobjects中,它的源代码存放在系统表syscomments中。可以使用使用企业管理器或系统存储过程来查看用户创建的存储过程。  
  117.   
  118.   
  119. 使用企业管理器查看用户创建的存储过程  
  120.   
  121.    在企业管理器中,打开指定的服务器和数据库项,选择要创建存储过程的数据库,单击存储过程文件夹,此时在右边的页框中显示该数据库的所有存储过程。用右键单击要查看的存储过程,从弹出的快捷菜单中选择属性选项,此时便可以看到存储过程的源代码。  
  122.   
  123.   
  124. 使用系统存储过程来查看用户创建的存储过程  
  125.   
  126. 可供使用的系统存储过程及其语法形式如下:  
  127. sp_help:用于显示存储过程的参数及其数据类型  
  128.    sp_help [[@objname=] name]  
  129. 参数name为要查看的存储过程的名称。  
  130.    sp_helptext:用于显示存储过程的源代码  
  131.    sp_helptext [[@objname=] name]  
  132. 参数name为要查看的存储过程的名称。  
  133.    sp_depends:用于显示和存储过程相关的数据库对象  
  134.    sp_depends [@objname=]’object’  
  135. 参数object为要查看依赖关系的存储过程的名称。  
  136.    sp_stored_procedures:用于返回当前数据库中的存储过程列表  
  137.   
  138. 修改存储过程  
  139.   
  140.   
  141.     存储过程可以根据用户的要求或者基表定义的改变而改变。使用Alter PROCEDURE语句可以更改先前通过执行 Create PROCEDURE 语句创建的过程,但不会更改权限,也不影响相关的存储过程或触发器。其语法形式如下:  
  142.    AlterPROC[EDURE]procedure_name[;number]  
  143. [{@parameterdata_type}  
  144. [VARYING][=default][OUTPUT]][,...n] [WITH  
  145.    {RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]  
  146. [FOR REPLICATION]  
  147. AS     
  148. sql_statement [ ...n ]  
  149.   
  150.   
  151. 重命名和删除存储过程  
  152.   
  153. 1. 重命名存储过程  
  154.   修改存储过程的名称可以使用系统存储过程sp_rename,其语法形式如下:  
  155.       sp_rename  原存储过程名称,新存储过程名称  
  156.       另外,通过企业管理器也可以修改存储过程的名称。  
  157.   
  158. 删除存储过程  
  159.   
  160.   
  161.    删除存储过程可以使用Drop命令,Drop命令可以将一个或者多个存储过程或者存储过程组从当前数据库中删除,其语法形式如下:  
  162.        drop procedure {procedure} [,…n]  
  163. 当然,利用企业管理器也可以很方便地删除存储过程。  
  164.   
  165. 存储过程的重新编译  
  166.   
  167.    在我们使用了一次存储过程后,可能会因为某些原因,必须向表中新增加数据列或者为表新添加索引,从而改变了数据库的逻辑结构。这时,需要对存储过程进行重新编译,SQL Server提供三种重新编译存储过程的方法 :  
  168.     1、在建立存储过程时设定重新编译  
  169.        语法格式:Create  PROCEDURE   procedure_name    WITH   RECOMPILE    AS   sql_statement  
  170.      2、在执行存储过程时设定重编译  
  171.        语法格式: EXECUTE  procedure_name  WITH  RECOMPILE  
  172.     3、通过使用系统存储过程设定重编译  
  173.         语法格式为:  EXEC  sp_recompile  OBJECT  
  174.   
  175.   
  176. 系统存储过程与扩展存储过程  
  177.   
  178. 1.系统存储过程  
  179.            系统存储过程存储在master数据库中,并以sp_为前缀,主要用来从系统表中获取信息,为系统管理员管理SQL Server提供帮助,为用户查看数据库对象提供方便。比如用来查看数据库对象信息的系统存储过程sp_help、显示存储过程和其它对象的文本的存储过程sp_helptext等。  
  180.   
  181.   
  182. 2.扩展存储过程:  
  183.           扩展存储过程以xp_为前缀,它是关系数据库引擎的开放式数据服务层的一部分,其可以使用户在动态链接库(DLL)文件所包含的函数中实现逻辑,从而扩展了Transact-SQL的功能,并且可以象调用Transact-SQL过程那样从Transact-SQL语句调用这些函数。  
  184.       例:  利用扩展存储过程xp_cmdshell为一个操作系统外壳执行指定命令串,并作为文本返回任何输出。  
  185.       执行代码:  
  186.          use master  
  187.           exec xp_cmdshell 'dir *.exe'     
  188.        执行结果返回系统目录下的文件内容文本信息。  
  189.   
  190. 最后给大家举一个例子:  
  191.   
  192.   
  193. QUOTE:  
  194.   
  195. IF exists (select * from SysObjects where name='more_than_total' and type='p')  
  196.    drop procedure more_than_total  
  197. go  
  198. Create PROCEDURE More_Than_Total  
  199.         @total money = 0  
  200. AS  
  201. Declare @amount smallint  
  202. BEGIN  
  203.         select distinct  
  204.            P.productName,  
  205.            S.contactName,  
  206.            P.UnitPrice  
  207.              
  208.     from Products P inner join [order Details] O  
  209.          on p.productID=o.productID inner join suppliers s  
  210.          on p.supplierID=s.SupplierID  
  211.     where O.productID in  
  212.     (select productID  
  213.      from   [order Details]  
  214.      group by productId  
  215.      having sum(quantity*unitprice)>@total  
  216.     )  
  217.   
  218. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/renzhaoqiang/archive/2009/08/21/4468848.aspx  
  219.   
  220.   
  221.   
  222. 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiaowei_001/archive/2009/10/09/4645814.aspx  

Tags: SQL 存储过程

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 48

sqlserver 系统存储过程

SQL代码
  1.  
  2.    
  3. sqlserver 系统存储过程这样大家就知道这些存储过程的作用了。  
  4. /*存储过程*/  
  5. sp_databases --列出服务器上的所有数据库  
  6. sp_server_info --列出服务器信息,如字符集,版本和排列顺序  
  7. sp_stored_procedures--列出当前环境中的所有存储过程  
  8. sp_tables --列出当前环境中所有可以查询的对象  
  9. sp_start_job --立即启动自动化任务  
  10. sp_stop_job --停止正在执行的自动化任务  
  11. sp_password --添加或修改登录帐户的密码  
  12. sp_configure --显示(不带选项)或更改(带选项)当前服务器的全局配置设置  
  13. sp_help --返回表的列名,数据类型,约束类型等  
  14. sp_helptext --显示规则,默认值,未加密的存储过程,用户定义的函数,  
  15. --触发器或视图的实际文本  
  16. sp_helpfile --查看当前数据库信息  
  17. sp_dboption --显示或更改数据库选项  
  18. sp_detach_db --分离数据库  
  19. sp_attach_db --附加数据库  
  20. sp_addumpdevice --添加设备  
  21. sp_dropdevice --删除设备  
  22. sp_pkeys --查看主键  
  23. sp_fkeys --查看外键  
  24. sp_helpdb --查看指定数据库相关文件信息  
  25. sp_addtype --自建数据类型  
  26. sp_droptype --删除自建数据类型  
  27. sp_rename --重新命名数据库  
  28. sp_executesql --执行SQL语句  
  29. sp_addlogin --添加登陆  
  30. sp_droplogin --删除登录  
  31. sp_grantdbaccess --把用户映射到登录,即添加一个数据库安全帐户并授予塔访问权限  
  32. sp_revokedbaccess--撤销用户的数据访问权,即从数据库中删除一个安全帐户  
  33. sp_addrole --添加角色  
  34. sp_addrolemember --向角色中添加成员,使其成为数据库角色的成员  
  35. sp_addsrvrolemember--修改登录使其成为固定服务器角色的成员  
  36. sp_grantlogin --允许使用组帐户或系统用户使用Windows身份验证连接到SQL  
  37. sp_defaultdb --修改一个登录的默认数据库  
  38. sp_helpindex --用于查看表的索引  
  39. sp_cursoropen --定义与游标和游标选项相关的SQL语句,然后生成游标  
  40. sp_cursorfetch --从游标中提取一行或多行  
  41. sp_cursorclose --关闭并释放游标  
  42. sp_cursoroption --设置各种游标选项  
  43. sp_cursor --用于请求定位更新  
  44. sp_cursorprepare --把与游标有关的T-SQL语句或批处理编译成执行计划,但并不创建游标  
  45. sp_cursorexecute --从由sp_cursorprepare创建的执行计划中创建并填充游标  
  46. sp_cursorunprepare --废弃由sp_cursorprepare生成的执行计划  
  47. sp_settriggerorder --指定第一个或最后一个激发的、与表关联的 AFTER 触发器。在第一个  
  48. --和最后一个触发器之间激发的 AFTER 触发器将按未定义的顺序执行   
  49. 详细出处参考:http://www.jb51.net/article/18596.htm  

Tags: SQL 存储过程

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 41

MsSql 存储过程分页代码  

SQL代码
  1. MsSql 存储过程分页代码  
  2.   
  3.   
  4. --使用说明 本代码适用于MsSql2000,对于其它数据库也可用.但没必要  
  5. --创建存储过程  
  6. Create PROCEDURE pagination  
  7. @tblName varchar(255), -- 表名  
  8. @strGetFields varchar(1000) = '*'-- 需要返回的列  
  9. @fldName varchar(255)=''-- 排序的字段名(可包含如TABLE.FLDNAME形式)  
  10. @PageSize int = 10, -- 页尺寸  
  11. @PageIndex int = 1, -- 页码  
  12. @doCount bit = 0, -- 返回记录总数, 非 0 值则返回  
  13. @OrderType bit = 0, -- 设置排序类型, 非 0 值则降序  
  14. @strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)  
  15. AS  
  16. declare @strSQL varchar(5000) -- 主语句  
  17. declare @strTmp varchar(110) -- 临时变量  
  18. declare @strOrder varchar(400) -- 排序类型  
  19. declare @fldName_t varchar(255) -- 在分页时用的排序字段名,不包含多表并列时的表名  
  20. set @fldName_t = right(@fldName,len(@fldName)-CHARINDEX('.',@fldName))  
  21. if @doCount != 0  
  22. begin  
  23. if @strWhere !=''  
  24. set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere  
  25. else  
  26. set @strSQL = 'select count(*) as Total from ' + @tblName + ''  
  27. end  
  28. -- 以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况  
  29. else  
  30. begin  
  31. if @OrderType != 0  
  32. begin  
  33. set @strTmp = '<(select min'  
  34. set @strOrder = ' order by ' + @fldName +' desc'  
  35. --如果@OrderType不是0,就执行降序,这句很重要!  
  36. end  
  37. else  
  38. begin  
  39. set @strTmp = '>(select max'  
  40. set @strOrder = ' order by ' + @fldName +' asc'  
  41. end  
  42. if @PageIndex = 1  
  43. begin  
  44. if @strWhere != ''  
  45. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder  
  46. else  
  47. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder  
  48. -- 如果是第一页就执行以上代码,这样会加快执行速度  
  49. end  
  50. else  
  51. begin  
  52. --以下代码赋予了@strSQL以真正执行的SQL代码  
  53. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' where ' + @fldName + ' ' + @strTmp + ' ('+ @fldName_t + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder  
  54. if @strWhere != ''  
  55. set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @tblName + ' where ' + @fldName + ' ' + @strTmp + ' ('+ @fldName_t + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder  
  56. end  
  57. end  
  58. exec (@strSQL)  
  59. go  
  60. --测试  
  61. create table news --建表  
  62. (  
  63. n_id int iDENTITY(1,1) primary key,  
  64. n_title char(200),  
  65. n_content text  
  66. )  
  67. --写循环插入1000000条的数据  
  68. create proc tt  
  69. as  
  70. declare @i int  
  71. set @i=0  
  72. while(@i<1000000)  
  73. begin  
  74. insert into news(n_title,n_content) values('sb','dsfsdfsd')  
  75. set @i=@i+1  
  76. end  
  77. exec tt  
  78. exec pagination 'news','*','n_id',1000,2,0,0,''   
  79.   
  80.   
  81. 自己改写的一个分页存储过程  
  82. Create PROC Paging  
  83. (  
  84. @pageSize int,  
  85. @pageIndex int,  
  86. @pageField nvarchar(32),  
  87. @countTotal bit=1,  
  88. @fieldQuery nvarchar(512),  
  89. @tableQuery nvarchar(512),  
  90. @whereQuery nvarchar(2048),  
  91. @orderQuery nvarchar(512)  
  92. )  
  93. AS  
  94. DECLARE @bdate Datetime  
  95. SET @bdate = getdate()  
  96. DECLARE @itemcount int  
  97. SET @itemcount=@pageIndex*@pageSize  
  98. DECLARE @itemlowwer int  
  99. SET @itemlowwer=(@pageIndex-1)*@pageSize  
  100. DECLARE @cmd nvarchar(3062)  
  101. IF @pageIndex=1  
  102. SET @cmd ='Select TOP ‘+CAST(@pageSize AS NVARCHAR)+' ‘+@fieldQuery+' FROM ‘+@tableQuery+' Where ‘+@whereQuery+' ORDER BY ‘+@orderQuery 
  103. ELSE 
  104. SET @cmd='Select ‘+@fieldQuery+' FROM ‘+@tableQuery+' Where ‘+@pageField+' IN (Select TOP ‘+CAST(@itemcount as nvarchar)+' ‘+@pageField+' FROM ‘+@tableQuery+' Where ‘+@whereQuery+' ORDER BY ‘+ @orderQuery+')  
  105. AND ‘+@pageField+' NOT IN (Select TOP ‘ +CAST(@itemlowwer as nvarchar)+' ‘+@pageField+' FROM ‘+@tableQuery+' Where ‘+@whereQuery+' ORDER BY ‘+ @orderQuery+')' 
  106. –print @cmd 
  107. EXEC(@cmd) 
  108. Select DATEDIFF( ms , @bdate , getdate() ) 
  109. IF @countTotal =1 
  110. BEGIN 
  111. SET @cmd = ‘Select COUNT( 0) FROM ‘+@tableQuery+' Where ‘+@whereQuery  
  112. EXEC(@cmd)  
  113. END  
  114. GO   

Tags: SQL 存储过程 分页

分类:MSSQL | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 41