码迷,mamicode.com
首页 > 数据库 > 详细

SQL语句大全从基础到熟练(不含数据库高端操作)日常用户 二

时间:2018-06-01 14:27:29      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:bsp   zhang   work   链接   drop   lob   lin   exe   硬盘分区   

前言:上一篇文章中都是在数据库中基础也是日常工作中经常用到的SQL,同志们温故知新后有什么感慨么?大脑的内存还是存储了不少东西的,平时觉得没什么

          一总结,呵!东西还不少。如果只是用于日常前面的一篇文章应该会满足大家工作之需,接下来这片文章在把SQL程序开发技巧和数据总结给大家整理(如果只是

           满足于日常应用前面的文章就已经满足可以跳过本章)。废话不多说开干!

一、数据开发

1、按姓氏笔画排序

Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多

2、数据库加密

select encrypt(原始密码)
select pwdencrypt(原始密码)
select pwdcompare(原始密码,加密后密码) = 1--相同;否则不相同encrypt(‘原始密码‘)
select pwdencrypt(原始密码)
select pwdcompare(原始密码,加密后密码) = 1--相同;否则不相同

3、取回表中字段

declare @list varchar(1000),
@sql nvarchar(1000) 
select @list=@list+,+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=表A
set @sql=select +right(@list,len(@list)-1)+ from 表A 
exec (@sql)

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,NSQL 事件探查器)
EXEC sp_msforeach_worker ?

7、记录搜索

Select Top N * From-------------------------------
N到M条记录(要有主索引ID)
Select Top M-N * FromWhere ID in (Select Top M ID From 表) Order by ID   Desc
----------------------------------
N到结尾记录
Select Top N * FromOrder by ID Desc
例如:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第到第个记录。
 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
例:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
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

8、获取当前数据库中的所有用户表

select Name from sysobjects where xtype=u and status>=0

获取某一个表的所有字段

select name from syscolumns where id=object_id(表名)
select name from syscolumns where id in (select id from sysobjects where type = u and name = 表名)
两种方式的效果相同

查看与某一个表相关的视图、存储过程、函数

select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like %表名%

查看当前数据库中所有存储过程

select name as 存储过程名称 from sysobjects where xtype=P

查询用户创建的所有数据库

select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name=sa)
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

查询某一个表的字段和数据类型

select column_name,data_type from information_schema.columns
where table_name = 表名

不同服务器数据库之间的数据操作

--创建链接服务器
exec sp_addlinkedserver ITSV ,  , SQLOLEDB , 远程服务器名或ip地址 
exec sp_addlinkedsrvloginITSV , false ,null, 用户名, 密码
--查询示例
select * from ITSV.数据库名.dbo.表名
--导入示例
select * intofrom ITSV.数据库名.dbo.表名
--以后不再使用时删除链接服务器
exec sp_dropserver  ITSV , droplogins 
--连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset
--查询示例
select * from openrowset( SQLOLEDB , sql服务器名; 用户名; 密码,数据库名.dbo.表名)
--生成本地表
select * intofrom openrowset( SQLOLEDB , sql服务器名; 用户名; 密码,数据库名.dbo.表名)
--把本地表导入远程表
insert openrowset( SQLOLEDB , sql服务器名; 用户名; 密码,数据库名.dbo.表名)
select *from 本地表
--更新本地表
update b set b.列A=a.列A from openrowset( SQLOLEDB , sql服务器名; 用户名; 密码,数据库名.dbo.表名)as a inner join 本地表 b
on a.column1=b.column1
--openquery用法需要创建一个连接
--首先创建一个连接创建链接服务器
exec sp_addlinkedserver   ITSV ,  , SQLOLEDB , 远程服务器名或ip地址
--查询
select * FROM openquery(ITSV,  SELECT *  FROM 数据库.dbo.表名)
--把本地表导入远程表
insert openquery(ITSV,  SELECT *  FROM 数据库.dbo.表名)
select * from 本地表
--更新本地表
update b set b.列B=a.列B FROM openquery(ITSV,  SELECT * 
 FROM 数据库.dbo.表名) as a 
inner join 本地表 b on a.列A=b.列A
--3、opendatasource/openrowset
SELECT   * FROM   opendatasource( SQLOLEDB ,  Data Source=ip/ServerName;User ID=登陆名;Password=密码 ).test.dbo.roy_ta
--把本地表导入远程表
insert opendatasource( SQLOLEDB ,  Data Source=ip/ServerName;User ID=登陆名;Password=密码).数据库.dbo.表名
select * from 本地表 

二、技巧(偏复杂一点点)

1、1=1,1=2的使用,在SQL语句组合时用的较多

where 1=1” 是表示选择全部    “where 1=2”全部不选,set @strSQL = select count(*) as Total from [ + @tblName + ] where 1=1 and + @strWhere 

2、收缩数据库

--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3、压缩数据库

dbcc shrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限

exec sp_change_users_login update_one,newname,oldname
go

5、检查备份集

RESTORE VERIFYONLY from disk=E:\dvbbs.bak

6、修复数据库

ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(dvbbs,repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

7、日志清除

SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
 @MaxMinutes INT,
 @NewSize INT
USE tablename -- 要操作的数据库名
SELECT  @LogicalFileName = tablename_log, -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
 @NewSize = 1  -- 你想设定的日志文件的大小(M)
Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT Original Size of  + db_name() +  LOG is  + 
 CONVERT(VARCHAR(30),@OriginalSize) +  8K pages or  + 
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + MB
 FROM sysfiles
 WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
 (DummyColumn char (8000) not null)
DECLARE @Counter    INT,
 @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
 @TruncLog = BACKUP LOG  + db_name() +  WITH TRUNCATE_ONLY
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
 AND (@OriginalSize * 8 /1024) > @NewSize  
 BEGIN -- Outer loop.
SELECT @Counter = 0
 WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
 BEGIN -- update
 INSERT DummyTrans VALUES (Fill Log) DELETE DummyTrans
 SELECT @Counter = @Counter + 1
 END
 EXEC (@TruncLog)  
 END
SELECT Final Size of  + db_name() +  LOG is  +
 CONVERT(VARCHAR(30),size) +  8K pages or  + 
 CONVERT(VARCHAR(30),(size*8/1024)) + MB
 FROM sysfiles 
 WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

8、说明:更改某个表

exec sp_changeobjectowner tablename,dbo

9、存储更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name    as NVARCHAR(128)
DECLARE @Owner   as NVARCHAR(128)
DECLARE @OwnerName   as NVARCHAR(128)
DECLARE curObject CURSOR FOR 
select Name    = name,
   Owner    = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN     
if @Owner=@OldOwner 
begin
   set @OwnerName = @OldOwner + . + rtrim(@Name)
   exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
    insert into test (userid) values(@i)
    set @i=@i+1
end
案例:
有如下表,要求就裱中所有沒]]有及格的成績,在每次增長LL.1的基礎AA上,使他們剛好及格:
    Name     score
    Zhangshan   80
    Lishi       59
    Wangwu      50
    Songquan    69
while((select min(score) from tb_table)<60)
begin
update tb_table set score =score*1.01
where score<60
if  (select min(score) from tb_table)>60
  break
 else
    continue
end

 

SQL语句大全从基础到熟练(不含数据库高端操作)日常用户 二

标签:bsp   zhang   work   链接   drop   lob   lin   exe   硬盘分区   

原文地址:https://www.cnblogs.com/SmileIven/p/9121305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!