返回> 网站首页 

SQLServer2008存储过程

yoours2013-11-24 17:38:59 阅读 1633

简介一边听听音乐,一边写写文章。

1. 删除存储过程
DROP PROCEDURE MyQQGroupTableSearch
DROP PROCEDURE MyQQGroupTable
DROP PROCEDURE MyQQDBGroup

2. 执行存储过程
EXEC MyQQDBGroup 'QQ号';
GO

3. 查询存储过程
select *   from sys.objects   where type='P'

4.  创建存储过程

// 第一个存储过程
CREATE PROCEDURE MyQQGroupTableSearch
@QQDBName varchar(255),
@QQTableName varchar(255),
@QQNum varchar(255)
AS
EXEC('select * from [' + @QQDBName + '].[dbo].[' + @QQTableName + '] where QQNum=' + @QQNum)
GO

// 第二个存储过程
--////////////////////////////////////////////////////////////////////////////////////////
CREATE PROCEDURE MyQQGroupTable
@QQDBName varchar(255),
@QQNum varchar(255)
AS
--查询表名称
declare @QQTableName varchar(255);
DECLARE QQ1_cursor cursor for SELECT name FROM sysobjects WHERE xtype='U'
open QQ1_cursor
fetch next from QQ1_cursor into @QQTableName
while(@@fetch_status=0)
--进入查询数据
begin
EXEC MyQQGroupTableSearch  @QQDBName, @QQTableName, @QQNum
    fetch next from QQ_cursor into @QQTableName
end

close QQ1_cursor
deallocate QQ1_cursor
GO

第三个存储过程
--/////////////////////////////////////////////////////////////////////////////////////////
CREATE PROCEDURE MyQQDBGroup
@QQNum varchar(255)
AS
declare @QQDBName varchar(255)
--查询数据库名称
DECLARE QQ_cursor cursor for select name from sys.databases where name like 'GroupData%'

open QQ_cursor
fetch next from QQ_cursor into @QQDBName
while(@@fetch_status=0)

begin
--进入查询表名称
EXEC MyQQGroupTable @QQDBName, @QQNum
    fetch next from QQ_cursor into @QQDBName
end

close QQ_cursor
deallocate QQ_cursor
GO

存储过程未调试完成,还存在bug等待解决。循环所有数据库,循环所有表。游标问题未解决。

5. 存储过程调试OK
CREATE PROCEDURE MyQQDBGroup
@QQNum varchar(255)
AS
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = COALESCE(@SQL,'') + '
USE [?];
--屏蔽掉不需要的数据库
IF ''?'' like(''GroupData%'')
BEGIN
PRINT ''?''

DECLARE @schemas_name VARCHAR(255);
DECLARE @table_name VARCHAR(255);
DECLARE @MySQL NVARCHAR(255);

DECLARE Info_cursor CURSOR FOR
    --获取schemas_name和table_name
    SELECT b.name AS schemas_name,''[''+a.[name]+'']'' AS table_name FROM ?.sys.tables AS a
        LEFT JOIN ?.sys.schemas AS b
        ON a.schema_id = b.schema_id
        WHERE TYPE=''U''

OPEN Info_cursor
FETCH NEXT FROM Info_cursor INTO @schemas_name,@table_name

WHILE @@FETCH_STATUS = 0
BEGIN
    --把表信息插入到临时表
    SET @table_name = ''[''+@schemas_name+'']''+''.''+@table_name
    SET @MySQL = ''select * from ['' +''?''+''].''+@table_name+'' where QQNum='+@QQNum+'''
    PRINT @MySQL
    EXEC sp_executesql @MySQL

    FETCH NEXT FROM Info_cursor INTO @schemas_name,@table_name
END

CLOSE Info_cursor
DEALLOCATE Info_cursor
END
'
--循环所有数据库
PRINT @SQL
EXEC sp_MSForEachDB @SQL
GO

执行
EXEC MyQQDBGroup 'QQ号';
GO

循环所有数据库,所有表进行查询。调试成功

6. 优化
1. 存储过程少用游标,游标多了慢;
2. 查询几率多的字段建成索引;
     索引 文件 尽量用 boolean integer double 和 定长varchar 这些,不要用 不定长 可变的数据;
3. 少些select * 之类的,查几个字段写上几个;
4. 有些字段能不用表与表之间关联尽量不用,设计的时候把要查的字段可以放到一张表中
     数据量大的话,宁可在表中多建一个字段存上这个值也别用多表外键关联来查
5. 大概率的 东西 往 靠近where的地方写
     尽量用 boolean intger long varchar 的 顺序 来 检索
6. 能不用 字符 就不用
7. 尽量减少 sql 结果的 笛卡儿积 的 大小。笛卡儿积得名于笛卡儿,他的解析几何的公式化引发了这个概念。
8. 分组统计用临时表
9. 分析sql性能的
10.做主从库
11. MySql使用EXPLAIN关键字做性能分析

微信小程序扫码登陆

文章评论

1633人参与,0条评论