一、根底
1、创立数据库
CREATE DATABASE database-name复制代码
2、删除数据库
drop database dbname复制代码
3、备份sql server
--- 创立 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_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.cB: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 time2select 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 insert 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 !='' beginset @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhereendelse beginset @strSQL = 'select count(*) as Total from [' + @tblName + ']' end复制代码
咱们能够间接写成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安宁 '+ @strWhere 复制代码
2、膨胀数据库
--重建索引DBCC REINDEXDBCC INDEXDEFRAG--膨胀数据和日志DBCC SHRINKDBDBCC 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_USERGODBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCKGOALTER DATABASE [dvbbs] SET MULTI_USERGO复制代码
7、日志革除
SET NOCOUNT ONDECLARE @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 / initializeDECLARE @OriginalSize intSELECT @OriginalSize = size FROM sysfiles WHERE name = @LogicalFileNameSELECT '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 = @LogicalFileNameCREATE 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) ENDSELECT '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 = @LogicalFileNameDROP TABLE DummyTransSET NOCOUNT OFF复制代码
8、更改某个表
exec sp_changeobjectowner 'tablename','dbo'复制代码
9、存储更改全副表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch@OldOwner as NVARCHAR(128),@NewOwner as NVARCHAR(128)ASDECLARE @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 sysobjectswhere user_name(uid)=@OldOwnerorder by nameOPEN curObjectFETCH NEXT FROM curObject INTO @Name, @OwnerWHILE(@@FETCH_STATUS=0)BEGIN if @Owner=@OldOwner begin set @OwnerName = @OldOwner + '.' + rtrim(@Name) exec sp_changeobjectowner @OwnerName, @NewOwnerend-- select @name,@NewOwner,@OldOwnerFETCH NEXT FROM curObject INTO @Name, @OwnerENDclose curObjectdeallocate curObjectGO复制代码
10、SQL SERVER中间接循环写入数据
declare @i intset @i=1while @i<30begin insert into test (userid) values(@i) set @i=@i+1end复制代码
案例:有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
Name scorZhangshan 80Lishi 59Wangwu 50Songquan 69while((select min(score) from tb_table)<60) beginupdate tb_table set score =score*1.01where score<60if (select min(score) from tb_table)>60 break else continueend复制代码
数据开发-经典
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 '相等'elseprint '不相等'复制代码
6.杀掉所有的事件探察器过程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocessesWHERE 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.columnswhere 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 bset b.列A=a.列A from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '明码 ',数据库名.dbo.表名)as a inner join 本地表 bon 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/openrowsetSELECT * 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 nocount
on
使返回的后果中不蕴含无关受 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) [下一步] 设置快照文件夹
采纳默认servernamePub
(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.telphonefrom srv2.库名.dbo.author b,author iwhere 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 iwhere not exists(select * from srv2.库名.dbo.author where id=i.id)--删除曾经删除的数据(如果需要的话)delete bfrom srv2.库名.dbo.author bwhere not exists(select * from author where id=b.id)go复制代码