mysql sql语句大全

这篇文章主要向大家介绍MySQL sql语句大全,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

mysql sql语句大全

一、说明:建立数据库

CREATE DATABASE database - name

二、说明:删除数据库

drop database dbname

三、说明:备份sql server

— 建立 备份数据的 device

USE master

EXEC sp_addumpdevice ‘disk’ , ‘testBack’ , ‘c:\mssql7backup\MyNwind_1.dat’

— 开始 备份

BACKUP DATABASE pubs TO testBack

四、说明:建立新表

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

五、说明:删除新表

drop table tabname

六、说明:增长一个列

Alter table tabname add column col type

注:列增长后将不能删除。DB2中列加上后数据类型也不能改变,惟一能改变的是增长 varchar 类型的长度。

七、说明:添加主键: Alter table tabname add primary key (col)

说明:删除主键: Alter table tabname drop primary key (col)

八、说明:建立索引: create [ unique ] index idxname on tabname(col….)

删除索引: drop index idxname

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

九、说明:建立视图: create view viewname as select statement

删除视图: drop view viewname

十、说明:几个简单的基本的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

十一、说明:几个高级查询运算词

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 ),不消除重复行。

注:使用运算词的几个查询结果行必须是一致的。

十二、说明:使用外链接

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 :

全外链接:不只包括符号链接表的匹配行,还包括两个链接表中的全部记录。

十二、分组: Group by :

一张表,一旦分组完成后,查询后只能获得组相关的信息。

组相关的信息:(统计信息) count , sum , max , min , avg 分组的标准)

在SQLServer中分组时:不能以text,ntext,image类型的字段做为分组依据

在selecte统计函数中的字段,不能和普通的字段放在一块儿;

1三、对数据库进行操做:

分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接代表,附加须要完整的路径名

14.如何修改数据库的名称:

sp_renamedb ‘old_name’ , ‘new_name’

2、提高 一、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一: select * into b

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

a 二、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c)

select d,e,f from b; 三、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) insert

into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件 例子:…

from b in ‘"&Server.MapPath(".")&"\data.mdb" &"’ where …

四、说明:子查询(表名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)

五、说明:显示文章、提交人和最后回复时间 select a.title,a.username,b.adddate from table

a,( select max (adddate) adddate from table where table

.title=a.title) b 六、说明:外链接查询(表名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 七、说明:在线视图查询(表名1:a

) select * from ( SELECT a,b,c FROM a) T where t.a > 1; 八、说明:

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 九、说明: in 的使用方法 select

  • from table1 where a [ not ] in (‘值1’,’值2’,’值4’,’值6’) 十、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists (

    select * from table2 where table1.field1=table2.field1 )

    十一、说明:四表联查问题: 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

    … 十二、说明:日程安排提早五分钟提醒 SQL: select * from 日程安排 where datediff(

    ‘minute’ ,f开始时间,getdate())>5 1三、说明:一条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

    的字段若是是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时若是处在索引则首先查询索引)

    1四、说明:前10条记录 select top 10 * form table1 where 范围

    1五、说明:选择在每一组b值相同的数据中对应的a最大的记录的全部信息(相似这样的用法能够用于论坛每个月排行榜,每个月热销产品分析,按科目成绩排名,等等.)

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

    tablename tb where tb.b=ta.b) 1六、说明:包括全部在 TableA 中但不在 TableB和TableC

    中的行并消除全部重复行而派生出一个结果表 ( select a from tableA ) except ( select a

    from tableB) except ( select a from tableC) 1七、说明:随机取出10条数据

    select top 10 * from tablename order by newid() 1八、说明:随机选择记录

    select newid() 1九、说明:删除重复记录 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表明用户 2一、说明:列出表里的全部的列名 select name from syscolumns

    where id=object_id( ‘TableName’ )

    2二、说明:列示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 2三、说明:初始化表table1 TRUNCATE TABLE table1 2四、说明:选择从10到15的记录

    select top 5 * from ( select top 15 * from table order by

    id asc ) table_别名 order by id desc 3、技巧

    一、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 二、收缩数据库

    –重建索引 DBCC REINDEX DBCC INDEXDEFRAG

    –收缩数据和日志 DBCC SHRINKDB DBCC SHRINKFILE 三、压缩数据库 dbcc shrinkdatabase(dbname) 四、转移数据库给新用户以已存在用户权限 exec sp_change_users_login

    ‘update_one’ , ‘newname’ , ‘oldname’ go 五、检查备份集 RESTORE VERIFYONLY

    from disk= ‘E:\dvbbs.bak’ 六、修复数据库 ALTER DATABASE [dvbbs] SET

    SINGLE_USER GO DBCC CHECKDB( ‘dvbbs’ ,repair_allow_data_loss) WITH

    TABLOCK GO ALTER DATABASE [dvbbs] SET MULTI_USER GO 七、日志清除 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 八、说明:更改某个表 exec sp_changeobjectowner ‘tablename’ , ‘dbo’

    九、存储更改所有表 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 十、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 score Zhangshan 80 Lishi 59 Wangwu 50

    Songquan 69 while(( select min (score) from tb_table)<60) begin

    update tb_table set score =score1.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)

–一、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

–三、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 nocount { on | off } 使返回的结果中不包含有关受 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、 预备工做

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的端口,取消选择"动态决定端口",并输入对应的端口号 2、 正式配置 一、配置发布服务器 打开企业管理器,在发布服务器(B、C、D)上执行如下步骤: (1)

从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导 (2) [下一步] 选择分发服务器

能够选择把发布服务器本身做为分发服务器或者其余sql的服务器(选择本身) (3) [下一步] 设置快照文件夹

采用默认\servername\Pub (4) [下一步] 自定义配置 能够选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置

否,使用下列默认设置(推荐) (5) [下一步] 设置分发数据库名称和位置 采用默认值 (6) [下一步] 启用发布服务器

选择做为发布的服务器 (7) [下一步] 选择须要发布的数据库和发布类型 (8) [下一步] 选择注册订阅服务器 (9) [下一步]

完成配置 二、建立出版物 发布服务器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