关于sql:纯干货15000-字语法手册分享给你看完搞懂再也不担心SQL写不好了

31次阅读

共计 16527 个字符,预计需要花费 42 分钟才能阅读完成。

起源:cnblogs.com/liuqifeng/p/9148831.html

一、根底

1、创立数据库

CREATE DATABASE database-name

2、删除数据库

drop database dbname

3、备份 sql server

--- 创立 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'-
-- 开始 备份
BACKUP DATABASE pubs TO testBack 

4、创立新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)  
#依据已有的表创立新表:A:create table tab_new like tab_old (应用旧表创立新表)  
B:create table tab_new as select col1,col2… from tab_old definition only

5、删除新表

drop table tabname 

6、减少一个列

Alter table tabname add column col type

注:列减少后将不能删除。DB2 中列加上后数据类型也不能扭转,惟一能扭转的是减少 varchar 类型的长度。

7、主键

增加主键:Alter table tabname add primary key(col) 
删除主键:Alter table tabname drop primary key(col) 

8、索引

创立索引:create [unique] index idxname on tabname(col….) 
删除索引:drop index idxname

注:索引是不可更改的,想更改必须删除从新建。9、阐明:

创立视图:create view viewname as select statement
删除视图:drop view viewname

10、几个简略的根本的 sql 语句

抉择:select * from table1 where 范畴
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范畴
更新:update table1 set field1=value1 where 范畴
查找:select * from table1 where field1 like’%value1%’---like 的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
均匀:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1

11、几个高级查问运算词

  • A:UNION 运算符

UNION 运算符通过组合其余两个后果表(例如 TABLE1 和 TABLE2)并消去表中任何反复行而派生出一个后果表。当 ALL 随 UNION 一起应用时(即 UNION ALL),不打消反复行。两种状况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

  • B:EXCEPT 运算符

EXCEPT 运算符通过包含所有在 TABLE1 中但不在 TABLE2 中的行并打消所有反复行而派生出一个后果表。当 ALL 随 EXCEPT 一起应用时 (EXCEPT ALL),不打消反复行。

  • C:INTERSECT 运算符

INTERSECT 运算符通过只包含 TABLE1 和 TABLE2 中都有的行并打消所有反复行而派生出一个后果表。当 ALL 随 INTERSECT 一起应用时 (INTERSECT ALL),不打消反复行。注:应用运算词的几个查问后果行必须是统一的。

12、应用外连贯

A、left(outer)join:#左外连贯(左连贯):后果集几包含连贯表的匹配行,也包含左连贯表的所有行。SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c  
B:right(outer)join:   
#右外连贯(右连贯):后果集既包含连贯表的匹配连贯行,也包含右连贯表的所有行。C:full/cross(outer)join:#全外连贯:不仅包含符号连贯表的匹配行,还包含两个连贯表中的所有记录。

12、分组:Group by

一张表,一旦分组 实现后,查问后只能失去组相干的信息。组相干的信息:(统计信息)count,sum,max,min,avg  分组的规范) 在 SQLServer 中分组时:不能以 text,ntext,image 类型的字段作为分组根据 在 selecte 统计函数中的字段,不能和一般的字段放在一起;

13、对数据库进行操作

拆散数据库:sp_detach_db;
附加数据库:sp_attach_db 后接表明,附加须要残缺的路径名

14. 如何批改数据库的名称

sp_renamedb 'old_name', 'new_name'

二、晋升

1、复制表(只复制构造, 源表名:a 新表名:b) (Access 可用)

法一:select * into b from a where 1<>1(仅用于 SQlServer)法二:select top 0 * into b from a

2、拷贝表(拷贝数据, 源表名:a 指标表名:b) (Access 可用)

insert into b(a, b, c) select d,e,f from b;

3、跨数据库之间表的拷贝(具体数据应用绝对路径) (Access 可用)

insert into b(a, b, c) select d,e,f from b in‘具体数据库’where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb"&"' where..

4、子查问(表名 1:a 表名 2:b)

select a,b,c from a where a IN (select d from b) 或者: select a,b,c from a where a IN (1,2,3)

5、显示文章、提交人和最初回复工夫

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、外连贯查问(表名 1:a 表名 2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、在线视图查问(表名 1:a)

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、between 的用法,between 限度查问数据范畴时包含了边界值,not between 不包含

select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值 1 and 数值 2 

9、in 的应用办法

select * from table1 where a [not] in (‘值 1’,’值 2’,’值 4’,’值 6’)

10、两张关联表,删除主表中曾经在副表中没有的信息

delete from table1 where not exists (select * from table2 where table1.field1=table2.field1)

11、四表联查问题

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、日程安排提前五分钟揭示

SQL: select * from 日程安排 where datediff('minute',f 开始工夫,getdate())>5

13、一条 sql 语句搞定数据库分页

select top 10 b.* from (select top 20 主键字段, 排序字段 from 表名 order by 排序字段 desc) a, 表名 b where b. 主键字段 = a. 主键字段 order by a. 排序字段

具体实现:对于数据库分页:

declare @start int,@end int  
 @sql  nvarchar(600)  
 set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’exec sp_executesql @sql  
  
#留神:在 top 后不能间接跟一个变量,所以在理论利用中只有这样的进行非凡的解决。Rid 为一个标识列,如果 top 后还有具体的字段,这样做是十分有益处的。因为这样能够防止 top 的字段如果是逻辑索引的,查问的后果后理论表中的不统一(逻辑索引中的数据有可能和数据表中的不统一,而查问时如果处在索引则首先查问索引)

14、前 10 条记录

select top 10 * form table1 where 范畴

15、抉择在每一组 b 值雷同的数据中对应的 a 最大的记录的所有信息(相似这样的用法能够用于论坛每月排行榜, 每月热销产品剖析, 按科目成绩排名, 等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、包含所有在 TableA 中但不在 TableB 和 TableC 中的行并打消所有反复行而派生出一个后果表

(select a from tableA) except (select a from tableB) except (select a from tableC)

17、随机取出 10 条数据

select top 10 * from tablename order by newid()

18、随机抉择记录

select newid()

19、删除重复记录

1) delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
2) select distinct * into temp from tablename  
delete from tablename  
nsert into tablename select * from temp

评估:这种操作株连大量的数据的挪动,这种做法不适宜大容量但数据操作 3), 例如:在一个内部表中导入数据,因为某些起因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全副导入,这样也就产生好多反复的字段,怎么删除反复字段

alter table tablename  
-- 增加一个自增列  
add  column_b int identity(1,1)  
 delete from tablename where column_b not in(select max(column_b) from tablename group by column1,column2,...)  
alter table tablename drop column column_b

20、列出数据库里所有的表名

select name from sysobjects where type='U' // U 代表用户

21、列出表里的所有的列名

select name from syscolumns where id=object_id('TableName')

22、列示 type、vender、pcs 字段,以 type 字段排列,case 能够不便地实现多重选择,相似 select 中的 case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type  
#显示后果:type vender pcs  
电脑 A 1  
电脑 A 1  
光盘 B 2  
光盘 A 2  
手机 B 3  
手机 C 3

23、初始化表 table1

TRUNCATE TABLE table1

24、抉择从 10 到 15 的记录

select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

三、技巧

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

“where 1=1”是示意抉择全副“where 1=2”全副不选,如:if @strWhere !=''   
begin  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where' + @strWhere  
end  
else   
begin  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'   
end

咱们能够间接写成

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安宁'+ @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

案例:有如下表,要求就裱中所有沒有及格的成績,在每次增長 0.1 的基礎上,使他們剛好及格:

Name   scor  
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

数据开发 - 经典

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',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

10:获取某一个表的所有字段

select name from syscolumns where id=object_id('表名')

select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')
#两种形式的成果雷同

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

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

12:查看以后数据库中所有存储过程

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

13:查问用户创立的所有数据库

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

14:查问某一个表的字段和数据类型

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

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

-- 创立链接服务器  
  
exec sp_addlinkedserver 'ITSV', '','SQLOLEDB ',' 近程服务器名或 ip 地址 'exec sp_addlinkedsrvlogin'ITSV ','false ',null,' 用户名 ',' 明码 '  
  
-- 查问示例  
  
select * from ITSV. 数据库名.dbo. 表名  
  
-- 导入示例  
  
select * into 表 from ITSV. 数据库名.dbo. 表名  
  
-- 当前不再应用时删除链接服务器  
  
exec sp_dropserver 'ITSV', 'droplogins'  
  
-- 连贯近程 / 局域网数据(openrowset/openquery/opendatasource)  
  
--1、openrowset  
  
-- 查问示例  
  
select * from openrowset('SQLOLEDB', 'sql 服务器名'; '用户名'; '明码', 数据库名.dbo. 表名)  
  
-- 生成本地表  
  
select * into 表 from 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 本地表

SQL Server 根本函数

SQL Server 根本函数

  • 1. 字符串函数 长度与剖析用 1,datalength(Char_expr) 返回字符串蕴含字符数, 但不蕴含前面的空格
  • 2,substring(expression,start,length) 取子串,字符串的下标是从“1”,start 为起始地位,length 为字符串长度,理论利用中以 len(expression)获得其长度
  • 3,right(char_expr,int_expr) 返回字符串左边第 int_expr 个字符,还用 left 于之相同
  • 4,isnull(check_expression , replacement_value)如果 check_expression 為空,則返回 replacement_value 的值,不為空,就返回 check_expression 字符操作类
  • 5,Sp_addtype 自定義數據類型 例如:EXEC sp_addtype birthday, datetime, ‘NULL’
  • 6,set nocounton
    使返回的后果中不蕴含无关受 Transact-SQL 语句影响的行数的信息。如果存储过程中蕴含的一些语句并不返回许多理论的数据,则该设置因为大量缩小了网络流量,因而可显著进步性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在剖析时设置。
SET NOCOUNT 为 ON 时,不返回计数(示意受 Transact-SQL 语句影响的行数)。SET NOCOUNT 为 OFF 时,返回计数

常识

  • 在 SQL 查问中:from 后最多能够跟多少张表或视图:256
  • 在 SQL 语句中呈现 Order by, 查问时,先排序,后取
  • 在 SQL 中,一个字段的最大容量是 8000,而对于 nvarchar(4000), 因为 nvarchar 是 Unicode 码。

SQLServer2000 同步复制技术实现步骤

一、预备工作

1. 公布服务器, 订阅服务器都创立一个同名的 windows 用户, 并设置雷同的明码, 做为公布快照文件夹的无效拜访用户

– 管理工具

– 计算机管理

– 用户和组

– 右键用户

– 新建用户

– 建设一个隶属于 administrator 组的登陆 windows 的用户(SynUser)

2. 在公布服务器上, 新建一个共享目录, 做为公布的快照文件的寄存目录, 操作:

我的电脑 –D:\ 新建一个目录, 名为: PUB

– 右键这个新建的目录

– 属性 – 共享

– 抉择 ” 共享该文件夹 ”

– 通过 ” 权限 ” 按纽来设置具体的用户权限, 保障第一步中创立的用户(SynUser) 具备对该文件夹的所有权限

– 确定

3. 设置 SQL 代理 (SQLSERVERAGENT) 服务的启动用户(公布 / 订阅服务器均做此设置)

开始 – 程序 – 管理工具 – 服务

– 右键 SQLSERVERAGENT

– 属性 – 登陆 – 抉择 ” 此账户 ”

– 输出或者抉择第一步中创立的 windows 登录用户名(SynUser)

–“ 明码 ” 中输出该用户的明码

4. 设置 SQL Server 身份验证模式, 解决连贯时的权限问题(公布 / 订阅服务器均做此设置)

企业管理器

– 右键 SQL 实例 – 属性

– 安全性 – 身份验证

– 抉择 ”SQL Server 和 Windows”

– 确定

5. 在公布服务器和订阅服务器上相互注册

企业管理器

– 右键 SQL Server 组

– 新建 SQL Server 注册 …

– 下一步 – 可用的服务器中, 输出你要注册的近程服务器名 – 增加

– 下一步 – 连贯应用, 抉择第二个 ”SQL Server 身份验证 ”

– 下一步 – 输出用户名和明码(SynUser)

– 下一步 – 抉择 SQL Server 组, 也能够创立一个新组

– 下一步 – 实现

6. 对于只能用 IP, 不能用计算机名的, 为其注册服务器别名(此步在施行中没用到)

(在连接端配置, 比方, 在订阅服务器上配置的话, 服务器名称中输出的是公布服务器的 IP)

开始 – 程序 –Microsoft SQL Server– 客户端网络实用工具

– 别名 – 增加

– 网络库抉择 ”tcp/ip”– 服务器别名输出 SQL 服务器名

– 连贯参数 – 服务器名称中输出 SQL 服务器 ip 地址

– 如果你批改了 SQL 的端口, 勾销抉择 ” 动静决定端口 ”, 并输出对应的端口号

二、正式配置

1、配置公布服务器

关上企业管理器,在公布服务器(B、C、D)上执行以下步骤:

(1) 从 [工具] 下拉菜单的 [复制] 子菜单中选择 [配置公布、订阅服务器和散发] 呈现配置公布和散发向导

(2) [下一步] 抉择散发服务器 能够抉择把公布服务器本人作为散发服务器或者其余 sql 的服务器(抉择本人)

(3) [下一步] 设置快照文件夹

采纳默认 \servername\Pub

(4) [下一步] 自定义配置

能够抉择: 是, 让我设置散发数据库属性启用公布服务器或设置公布设置

否, 应用下列默认设置(举荐)

(5) [下一步] 设置散发数据库名称和地位 采纳默认值

(6) [下一步] 启用公布服务器 抉择作为公布的服务器

(7) [下一步] 抉择须要公布的数据库和公布类型

(8) [下一步] 抉择注册订阅服务器

(9) [下一步] 实现配置

2、创立出版物

公布服务器 B、C、D 上

(1)从 [工具] 菜单的 [复制] 子菜单中选择 [创立和治理公布] 命令

(2)抉择要创立出版物的数据库,而后单击[创立公布]

(3)在 [创立公布向导] 的提醒对话框中单击 [下一步] 零碎就会弹出一个对话框。对话框上的内容是复制的三个类型。咱们当初选第一个也就是默认的快照公布(其余两个大家能够去看看帮忙)

(4)单击 [下一步] 零碎要求指定能够订阅该公布的数据库服务器类型,

SQLSERVER 容许在不同的数据库如 orACLE 或 ACCESS 之间进行数据复制。

然而在这里咱们抉择运行 ”SQL SERVER 2000″ 的数据库服务器

(5)单击 [下一步] 零碎就弹出一个定义文章的对话框也就是抉择要出版的表

留神: 如果后面抉择了事务公布 则再这一步中只能抉择带有主键的表

(6)抉择公布名称和形容

(7)自定义公布属性 向导提供的抉择:

是 我将自定义数据筛选, 启用匿名订阅和或其余自定义属性

否 依据指定形式创立公布(倡议采纳自定义的形式)

(8)[下一步] 抉择筛选公布的形式

(9)[下一步] 能够抉择是否容许匿名订阅

1)如果抉择署名订阅, 则须要在公布服务器上增加订阅服务器

办法: [工具]->[复制]->[配置公布、订阅服务器和散发的属性]->[订阅服务器] 中增加

否则在订阅服务器上申请订阅时会呈现的提醒: 改公布不容许匿名订阅

如果依然须要匿名订阅则用以下解决办法

[企业管理器]->[复制]->[公布内容]->[属性]->[订阅选项] 抉择容许匿名申请订阅

2)如果抉择匿名订阅, 则配置订阅服务器时不会呈现以上提醒

(10)[下一步] 设置快照 代理程序调度

(11)[下一步] 实现配置

当实现出版物的创立后创立出版物的数据库也就变成了一个共享数据库

有数据

srv1. 库名..author 有字段:id,name,phone, srv2. 库名..author 有字段:id,name,telphone,adress

要求:

srv1. 库名..author 减少记录则 srv1. 库名..author 记录减少

srv1. 库名..author 的 phone 字段更新,则 srv1. 库名..author 对应字段 telphone 更新

–*/

– 大抵的解决步骤

–1. 在 srv1 上创立连贯服务器, 以便在 srv1 中操作 srv2, 实现同步

exec sp_addlinkedserver ‘srv2′,”,’SQLOLEDB’,’srv2 的 sql 实例名或 ip’

exec sp_addlinkedsrvlogin ‘srv2′,’false’,null,’ 用户名 ’,’ 明码 ’

go

–2. 在 srv1 和 srv2 这两台电脑中, 启动 msdtc(分布式事务处理服务), 并且设置为主动启动

。我的电脑 – 控制面板 – 管理工具 – 服务 – 右键 Distributed Transaction Coordinator– 属性 – 启动 – 并将启动类型设置为主动启动

go

– 而后创立一个作业定时调用下面的同步解决存储过程就行了

企业管理器

– 治理

–SQL Server 代理

– 右键作业

– 新建作业

–“ 惯例 ” 项中输出作业名称

–“ 步骤 ” 项

– 新建

–“ 步骤名 ” 中输出步骤名

–“ 类型 ” 中抉择 ”Transact-SQL 脚本(TSQL)”

–“ 数据库 ” 抉择执行命令的数据库

–“ 命令 ” 中输出要执行的语句: exec p_process

– 确定

–“ 调度 ” 项

– 新建调度

–“ 名称 ” 中输出调度名称

–“ 调度类型 ” 中抉择你的作业执行安顿

– 如果抉择 ” 重复呈现 ”

– 点 ” 更改 ” 来设置你的工夫安顿

而后将 SQL Agent 服务启动, 并设置为主动启动, 否则你的作业不会被执行

设置办法:

我的电脑 – 控制面板 – 管理工具 – 服务 – 右键 SQLSERVERAGENT– 属性 – 启动类型 – 抉择 ” 主动启动 ”– 确定.

–3. 实现同步解决的办法 2, 定时同步

-- 在 srv1 中创立如下的同步解决存储过程  
create proc p_process as  
  
-- 更新批改过的数据  
update b set name=i.name,telphone=i.telphone  
from srv2. 库名.dbo.author b,author i  
where b.id=i.id and  
(b.name <> i.name or b.telphone <> i.telphone)  
  
-- 插入新增的数据  
insert srv2. 库名.dbo.author(id,name,telphone)  
select id,name,telphone from author i  
where not exists(select * from srv2. 库名.dbo.author where id=i.id)  
  
-- 删除曾经删除的数据(如果需要的话)  
delete b  
from srv2. 库名.dbo.author b  
where not exists(select * from author where id=b.id)  
go

正文完
 0