数据库使用技巧

4.查看硬盘分区:
EXEC master..xp_fixeddrives

5.比较A,B表是否相等:
IF (SELECT checksum_agg(binary_checksum(*)) FROM A)
     =
    (SELECT checksum_agg(binary_checksum(*)) FROM B)
print '相等'
ELSE
print '不相等'

6.杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
EXEC sp_msforeach_worker '?'

7.记录搜索:
开头到N条记录
SELECT Top N * FROM 表
-------------------------------
N到M条记录(要有主索引ID)
SELECT Top M-N * FROM 表 WHERE ID IN (SELECT Top M ID FROM 表) ORDER BY ID   DESC
----------------------------------
N到结尾记录
SELECT Top N * FROM 表 ORDER BY ID DESC
案例
例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。

SELECT top 10 recid FROM A WHERE recid NOT  IN(SELECT top 30 recid FROM A)

分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

    SELECT top 10 recid FROM A WHERE……是从索引中查找,而后面的SELECT top 30 recid FROM A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

解决方案

1, 用ORDER BY SELECT top 30 recid FROM A ORDER BY ricid 如果该字段不是自增长,就会出现问题

2, 在那个子查询中也加条件:SELECT top 30 recid FROM A WHERE recid>-1

例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
SET @s = 'select top 1 * from T   where pid not in (select top ' + str(@count-1) + ' pid  from  T)'

print @s      exec  sp_executesql  @s

9:获取当前数据库中的所有用户表
SELECT Name FROM sysobjects WHERE xtype='u' AND status>=0

你可能感兴趣的:(数据结构,sql,XP)