SQL2008数据库优化常用脚本

--查询某个数据库的连接数
select count(*) from Master.dbo.SysProcesses where dbid=db_id()

--前10名其他等待类型
SELECT TOP 10 * from sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC

SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%'
OR wait_type like 'LAZYWRITER_SLEEP%'

--CPU的压力
SELECT scheduler_id, current_tasks_count, runnable_tasks_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255

查看更多内容...

Posted in 数据库 at February 7, 2014. by 傻猫 .    Views: 2796    No Comments

MSSQL删除所有存储过程

删除所有存储过程
use 数据库
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='P'
select @tname='drop Procedure ' + left(@tname,len(@tname)-1)
exec(@tname)

删除所有表
use 数据库
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='U'
select @tname='drop table ' + left(@tname,len(@tname)-1)
exec(@tname)

删除所有视图
use 数据库
declare @tname varchar(8000)
set @tname=''
select @tname=@tname + Name + ',' from sysobjects where xtype='V'
select @tname='drop View ' + left(@tname,len(@tname)-1)
exec(@tname)

Posted in 数据库 at January 8, 2014. by 傻猫 .    Views: 2016    No Comments

SQL查询数据库表名、表的列名

--读取库中的所有表名
select name from sysobjects where xtype='u'

--读取指定表的所有列名
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
获取数据库表名和字段
sqlserver中各个系统表的作用
    sysaltfiles      主数据库                  保存数据库的文件
syscharsets      主数据库                  字符集与排序顺序
sysconfigures    主数据库                  配置选项
syscurconfigs    主数据库                  当前配置选项
sysdatabases      主数据库                  服务器中的数据库
syslanguages      主数据库                  语言
syslogins        主数据库                  登陆帐号信息
sysoledbusers    主数据库                  链接服务器登陆信息
sysprocesses      主数据库                  进程
sysremotelogins主数据库                  远程登录帐号

syscolumns        每个数据库                列
sysconstrains    每个数据库                限制
sysfilegroups    每个数据库                文件组
sysfiles          每个数据库                文件
sysforeignkeys 每个数据库                外部关键字
sysindexs        每个数据库                索引
sysmenbers        每个数据库                角色成员
sysobjects        每个数据库                所有数据库对象
syspermissions 每个数据库                权限
systypes          每个数据库                用户定义数据类型
sysusers          每个数据库                用户

//
用什么方法可以得到一个表中所有的列名。SQl语句。
select      列名=name      from      syscolumns      where      id=object_id(N'要查的表名')

Posted in 数据库 at December 16, 2013. by 傻猫 .    Views: 3108    No Comments

关于MSSQL update 累加更新null的问题

遇到一个问题,累加更新备注字段

update 备注=备注+'新的内容'  where id=110

这样更新没有问题,但是当备注为null的时候,就有问题了

null+任何字符串都是null,我操,所以更新不成功,必须要转换一下。

update 备注=isnull(备注,'')+'新的内容'  where id=110

加一个判断就可以了。

Posted in 数据库 at October 28, 2013. by 傻猫 .    Views: 2887    No Comments

关于多对多关系数据的比较算法

昨天搞了一个小软件,主要分析多对多关系的数据,刚开始一直没有想到办法,后来想到了通过数据库数据读取来循环操作,功能实现了,但是要读取数据库很多次,效率感觉不行,于是又重新想了想,用动态数组的方法来实现,不读写数据库,速度也很快,而且充分发挥了CS客户端的效率,可以交由客户端来完成一些事务处理,这个是BS无法比的,哈哈。现将demo分享一下。

1、两张表,一个是学生信息表UserInfo,一个学科信息Project表

UserInfo信息如下

id,  name, myProject
1    tom     1,2,3,4
2    jim      1,3
3   sam      2,4

Project信息如下

id,name
1    math
2    english
3   chinese
4   Japanese

 myProject字段信息记录学生的科目信息,现在是需要在listview列表里显示某个学生的科目信息,所学科目打钩。

1、首先将所有科目信息填充到listview,第一列为科目ID

2、取出某学生的学科信息myProject值temp

第一种实现方法,通过数据库循环操作:

      for i:=0 to lv_hdtc.Items.Count-1 do
      begin
             //通过数据循环操作获取相关信息
            mysql:='select id from Project  where id in ('+temp+')';
            with data do
            begin
                  qry_temp.Close;
                  qry_temp.SQL.Clear;
                  qry_temp.SQL.Add(mysql);
                  qry_temp.Open;
                  for j:=0 to qry_temp.RecordCount-1 do
                  begin
                        if Trim(qry_temp.fieldbyname('id').AsString)=lvtxt then
                        lv_hdtc.Items.Item[i].Checked:=True;

                        qry_temp.FindNext;
                  end;
            end;
                       
      end;

第二种实现方法,使用动态数组:

    //mytc: array of string;
     i:=0;
     SetLength(mytc,Length(temp));
     while True do
     begin
             if Pos(',',temp)>0 then
             begin
                  SplitString(temp,',',l,r);
                  mytc[i]:=Trim(l);
                  temp:=Trim(r);
                  i:=i+1;
             end
             else
             begin
                 if i=0 then
                 mytc[0]:=Trim(temp)
                 else
                 mytc[i]:=Trim(temp);
                
                 Break;
             end;
     end;


      for i:=0 to lv_hdtc.Items.Count-1 do
      begin
            //通过本地数组格式化进行操作
            lvtxt:=Trim(lv_hdtc.Items.Item[i].Caption);

            for j:=0 to Length(mytc)-1 do
            begin
                  if Trim(mytc[j])=lvtxt then
                  lv_hdtc.Items.Item[i].Checked:=True;
            end;
          
      end;

 

Posted in 数据库 at June 20, 2013. by 傻猫 .    Views: 3318    No Comments

MSSQL复制表

复制表结构有句型的--跨数据库

--复制结构+数据
select * into 数据库名.dbo.新表名 from 数据库名.dbo.原表名
 
--只复制结构
select * into 数据库名.dbo.新表名 from 数据库名.dbo.原表名 where 1=0

--复制到临时表
select * into #temptablename from 数据库名.dbo.原表名 where 1=0

Posted in 数据库 at January 22, 2013. by 傻猫 .    Views: 3494    No Comments

MSSQL 游标多参数/取多列值

游标多参数循环操作,效率确实高了不少。

CREATE                  PROCEDURE p  AS

declare  @UserID  int
declare  @MinID  int
declare  @UserTEL varchar(20)
 
declare  cur_getUserID  cursor  for
      select main_id,tel,min(id)  from tel group by tel,main_id having count(*)>1    
 --select main_id,tel,min(id)  from tel where main_id=962192 and tel='15882188374' group by tel,main_id

open  cur_getUserID

fetch  next  from  cur_getUserID into @UserID,@UserTEL,@MinID
while(@@fetch_status  =  0)
begin 
 
 delete from tel where main_id=@UserID and tel=@UserTEL and id<>@MinID

 fetch  next  from  cur_getUserID into @UserID,@UserTEL,@MinID
end

close  cur_getUserID
deallocate  cur_getUserID

GO

Posted in 数据库 at January 9, 2013. by 傻猫 .    Views: 3069    No Comments

错误 21002: [SQL-DMO]用户“XXX”已经存在

SQL用户“xxx”已经存在的解决方法

MSSQL2000迁移数据库或者还原数据库后,新建相同用户名的时候或者指定数据库登录用户时出现错误提示“错误21002:[SQL-DMO]用户“XXX”已经存在

产生原因:
这就是我们通常所说的“孤立用户”,所谓孤立用户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。

我们建立了同样名称的数据库登录用户后,数据库中的表我们照样不能使用时因为sid的不同,就是系统登录表和数据库用户表中的用户名相同,但是sid字段不同,数据库中的还是以前旧系统的sid值,所以我们就要把它对应成我们新建的,数据库靠sid来识别用户。

[1g1g]滴答滴-侃侃#playID:-21707[/]

查看更多内容...

Posted in 数据库 at March 28, 2012. by 傻猫 .    Views: 7432    No Comments