存储过程中使用exec执行sql

再出发666 2010-01-17 11:14:32
由于需要,写了一个存储过程,里面3次使用exec执行一个拼凑好的sql语句,现在只是在sql server的客户端里面跑,没有放在应用程序下跑!
我想问的是,在存储过程中使用exec性能怎么样,多次使用会不会性能非常差,我很担心!本人菜鸟
...全文
2384 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilujia 2010-01-22
  • 打赏
  • 举报
回复
学习
rfq 2010-01-18
  • 打赏
  • 举报
回复
放在存储过程 使用
很好
没有问题
只有使用了才可能遇到问题
预测问题不太准
maomao90 2010-01-18
  • 打赏
  • 举报
回复
学习
aaajedll 2010-01-18
  • 打赏
  • 举报
回复
學習
gxjwqm 2010-01-18
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
学习
--小F-- 2010-01-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 whyf521 的回复:]
由于需要,写了一个存储过程,里面3次使用exec执行一个拼凑好的sql语句,现在只是在sql server的客户端里面跑,没有放在应用程序下跑!
我想问的是,在存储过程中使用exec性能怎么样,多次使用会不会性能非常差,我很担心!本人菜鸟
[/Quote]

问题不是很大 尽量把语句写优化点
--小F-- 2010-01-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 whyf521 的回复:]
那个存储过程在公司写的,还拿不出来,我想想大概的流程
1.使用exec错了一个创建全局临时表操作
2.多次向全局临时表进行插入数据操作

追加一个问题:sql server的insert语句是可以一次插入多条记录吧?
[/Quote]

是的

yananguo_1985 2010-01-17
  • 打赏
  • 举报
回复

sql server的insert语句是可以一次插入多条记录吧?

你可以用UNION把几个值联合起来插入
insert into ..
select ..
union
select ..


你也可以可以查询已经存在别的表中的数据
insert into .. select .. from ..
zjglovex 2010-01-17
  • 打赏
  • 举报
回复
看看这里你会得到你想要的答案的:
http://hi.baidu.com/ren_long_/blog/item/9881ed2c6e56ca3e359bf706.html
再出发666 2010-01-17
  • 打赏
  • 举报
回复
那个存储过程在公司写的,还拿不出来,我想想大概的流程
1.使用exec错了一个创建全局临时表操作
2.多次向全局临时表进行插入数据操作

追加一个问题:sql server的insert语句是可以一次插入多条记录吧?
SQL77 2010-01-17
  • 打赏
  • 举报
回复
存储过程效率比较好了,
在存储过程中使用exec性能怎么样?
多次使用得看你的具体情况,如果只是很简单的查询,效率基本不会相差很大
yananguo_1985 2010-01-17
  • 打赏
  • 举报
回复
这个不用担心。
pt1314917 2010-01-17
  • 打赏
  • 举报
回复
性能不会有太大影响。跟使用非动态是一样的。
关键是看你的语句
xman_78tom 2010-01-17
  • 打赏
  • 举报
回复
默认情况下,当再次调用存储过程时会重用过程缓存中的执行计划,除非缓存的执行计划超时。但是,在某些情况下数据库引擎会自动触发存储过程的重编译。具体来说,过程重编译的目的有两种:
修正执行计划,当存储过程引用的基对象的架构发生更改(添加/删除列、添加/删除索引、权限或绑定被更改),以及会话选项发生更改(与生成执行计划时的不一致)时,数据库引擎会重编译存储过程以符合当前的环境;
优化执行计划,当过程引用基表中的数据发生更改(达到一定量),或基表中的统计信息发生更改时,数据库引擎会重编译存储过程以重新优化过程。
如果调用存储过程中有频繁的重编译发生,显然会影响性能。

KB243586 详细解释了过程的重编译和解决方法
http://support.microsoft.com/kb/243586/EN-US
SQL77 2010-01-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 whyf521 的回复:]
引用 10 楼 xman_78tom 的回复:
在存储过程中使用动态语句,一般是没有什么性能影响的,因为这些动态语句会单独被编译为一个执行计划(在存储过程的执行计划外)供存储过程调用。有时会比使用静态语句,有更好的性能。不过需要注意 SQL 注入问题,需要检查用户的输入。

如果多次向全局临时表进行插入数据操作,应该注意存储过程的重编译。


存储过程的重编译?
[/Quote]
就是执行计划老化,所以有时候要采用重编译,
SQL Server 提供三种重新编译存储过程的方法:

sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。


创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。当存储过程的参数值在各次执行间都有较大差异,导致每次均需创建不同的执行计划时,可使用 WITH RECOMPILE 选项。此选项并不常用,因为每次执行存储过程时都必须对其进行重新编译,这样会使存储过程的执行变慢。


在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。


说明 如果删除或重命名了存储过程所引用的对象,那么在执行该存储过程时会返回错误。但如果用同名对象替换了存储过程中引用的对象,则可以不进行重新编译而继续执行该存储过程。

再出发666 2010-01-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xman_78tom 的回复:]
在存储过程中使用动态语句,一般是没有什么性能影响的,因为这些动态语句会单独被编译为一个执行计划(在存储过程的执行计划外)供存储过程调用。有时会比使用静态语句,有更好的性能。不过需要注意 SQL 注入问题,需要检查用户的输入。

如果多次向全局临时表进行插入数据操作,应该注意存储过程的重编译。

[/Quote]
存储过程的重编译?
xman_78tom 2010-01-17
  • 打赏
  • 举报
回复
在存储过程中使用动态语句,一般是没有什么性能影响的,因为这些动态语句会单独被编译为一个执行计划(在存储过程的执行计划外)供存储过程调用。有时会比使用静态语句,有更好的性能。不过需要注意 SQL 注入问题,需要检查用户的输入。

如果多次向全局临时表进行插入数据操作,应该注意存储过程的重编译
//附加数据库 sp_attach_db 当使用 sp_attach_db 系统存储过程附加数据库时。 sp_attach_db:将数据库附加到服务器。 语法 sp_attach_db [ @dbname = ] 'dbname' , [ @filename1 = ] 'filename_n' [ ,...16 ] 参数 [@dbname =] 'dbname' 要附加到服务器的数据库的名称。该名称必须是唯一的。dbname 的数据类型为 sysname,默认值为 NULL。 [@filename1 =] 'filename_n' 数据库文件的物理名称,包括路径。filename_n 的数据类型为 nvarchar(260),默认值为 NULL。最多可以指定 16 个文件名。 参数名称以 @filename1 开始,递增到 @filename16。文件名列表至少必须包括主文件,主文件包含指向数据库其它文件的系统表。 该列表还必须包括数据库分离后所有被移动的文件。 返回代码值:0(成功)或 1(失败) eg:下面的示例将 pubs 的两个文件附加到当前服务器。 EXEC sp_attach_db @dbname = N'pubs', @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf' EXEC sp_attach_db @dbname = N'Ty20051029101451aaa', @filename1 = N'd:\5屏幕\Ty20051029101451aaa_data.mdf', @filename2 = N'd:\5屏幕\Ty20051029101451aaa_log.ldf' ---解决问题了 //删除数据库 DROP DATABASE 从Microsoft? SQL Server? 删除一个或多个数据库。删除数据库将删除数据库所使用的数据库文件和磁盘文件。 语法 :DROP DATABASE database_name [ ,...n ] 参数 :database_name 指定要删除的数据库名称。从 master 数据库执行 sp_helpdb 以查看数据库列表。 eg: exec sp_helpdb database_name exec Drpo DataBase [Ty20051029101451aaa] //分离数据库 可以使用 sp_detach_db 存储过程分离该数据库,然后使用带有 FOR ATTACH 子句的 CREATE DATABASE 重新附加。 sp_detach_db Archive GO CREATE DATABASE Archive ON PRIMARY (FILENAME = 'c:\program files\microsoft sqlserver\mssql\data\archdat1.mdf') FOR ATTACH GO //显示当前数据库信息 --select * from Master..sysDatabases //新建---不行啊 CREATE DATABASE TestOA ALTER DATABASE TestOA SET OFFLINE WITH ROLLBACK IMMEDIATE RESTORE DATABASE TestOA From disk='C:\Documents and Settings\Administrator\桌面\帐套\data\Template.Dat' ALTER DATABASE TestOA SET OFFLINE WITH ROLLBACK IMMEDIATE exec sp_detach_db Km20051030011601 --分离数据库 exec sp_attach_single_file_db km20051030011601,'D:\TestDatabase\Km20051030011601.mdf'--只附加.mdf文件

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧