经典SQL语句大全、50个常用的sql语句
字 Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题: 1、查询“001”课程比“002”课程成绩高的所有学生的学号; ?select a.S# from (select s#,score from SC where C#='001') a,(select s#,score ?from SC where C#='002') b ?where a.score>b.score and a.s#=b.s#; 2、查询平均成绩大于60分的同学的学号和平均成绩; ????select S#,avg(score) ????from sc ????group by S# having avg(score) >60; 3、查询所有同学的学号、姓名、选课数、总成绩; ?select Student.S#,Student.Sname,count(SC.C#),sum(score) ?from Student left Outer join SC on Student.S#=SC.S# ?group by Student.S#,Sname 4、查询姓“李”的老师的个数; ?select count(distinct(Tname)) ?from Teacher ?where Tname like '李%'; 5、查询没学过“叶平”老师课的同学的学号、姓名; ????select Student.S#,Student.Sname ????from Student? ????where S# not in (select distinct( SC.S#) from SC,Course,Teacher where?SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平'); 6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; ?select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002'); 7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; ?select S#,Sname ?from Student ?where S# in (select S# from SC,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher?where Teacher.T#=Course.T# and Tname='叶平')); 8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; ?Select S#,Sname from (select Student.S#,score,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 ?from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score; 9、查询所有课程成绩小于60分的同学的学号、姓名; ?select S#,Sname ?from Student ?where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); 10、查询没有学全所有课的同学的学号、姓名; ????select Student.S#,Student.Sname ????from Student,SC ????where Student.S#=SC.S# group by?Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名; ????select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'; 12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; ????select distinct SC.S#,Sname ????from Student,SC ????where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; ????update SC set score=(select avg(SC_2.score) ????from SC SC_2 ????where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平'); 14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名; ????select S# from SC where C# in (select C# from SC where S#='1002') ????group by S# having count(*)=(select count(*) from SC where S#='1002'); 15、删除学习“叶平”老师课的SC表记录; ??? Delect SC ????from course,Teacher? ????where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平'; 16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、 ????号课的平均成绩; ????Insert SC select S#,'002',(Select avg(score) ????from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002'); 17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,数据库,企业管理,英语,有效课程数,有效平均分 ????SELECT S# as 学生ID ???????,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库 ???????,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理 ???????,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语 ???????,COUNT(*) AS 有效课程数,AVG(t.score) AS 平均成绩 ????FROM SC AS t ????GROUP BY S# ????ORDER BY avg(t.score)? 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 ????SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分 ????FROM SC L,SC AS R ????WHERE L.C# = R.C# and ??????? L.score?= (SELECT MAX(IL.score) ??????????????????????FROM SC AS IL,Student AS IM ??????????????????????WHERE L.C# = IL.C# and IM.S#=IL.S# ??????????????????????GROUP BY IL.C#) ????????AND ??????? R.score?= (SELECT MIN(IR.score) ??????????????????????FROM SC AS IR ??????????????????????WHERE R.C# = IR.C# ??????????????????GROUP BY IR.C# ??????????????????? ); 19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 ????SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩 ???????,100?* SUM(CASE WHEN?isnull(score,0)>=60?THEN?1?ELSE?0?END)/COUNT(*) AS 及格百分数 ????FROM SC T,Course ????where t.C#=course.C# ????GROUP BY t.C# ????ORDER BY?100?* SUM(CASE WHEN?isnull(score,0)>=60?THEN?1?ELSE?0?END)/COUNT(*) DESC 20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004) ????SELECT SUM(CASE WHEN C# ='001' THEN score ELSE?0?END)/SUM(CASE C# WHEN '001' THEN?1?ELSE?0?END) AS 企业管理平均分 ???????,100?* SUM(CASE WHEN C# = '001' AND score >=?60?THEN?1?ELSE?0?END)/SUM(CASE WHEN C# = '001' THEN?1?ELSE?0?END) AS 企业管理及格百分数 ???????,SUM(CASE WHEN C# = '002' THEN score ELSE?0?END)/SUM(CASE C# WHEN '002' THEN?1?ELSE?0?END) AS 马克思平均分 ???????,100?* SUM(CASE WHEN C# = '002' AND score >=?60?THEN?1?ELSE?0?END)/SUM(CASE WHEN C# = '002' THEN?1?ELSE?0?END) AS 马克思及格百分数 ???????,SUM(CASE WHEN C# = '003' THEN score ELSE?0?END)/SUM(CASE C# WHEN '003' THEN?1?ELSE?0?END) AS UML平均分 ???? ???,100?* SUM(CASE WHEN C# = '003' AND score >=?60?THEN?1?ELSE?0?END)/SUM(CASE WHEN C# = '003' THEN?1?ELSE?0?END) AS UML及格百分数 ???????,SUM(CASE WHEN C# = '004' THEN score ELSE?0?END)/SUM(CASE C# WHEN '004' THEN?1?ELSE?0?END) AS 数据库平均分 ???????,100?* SUM(CASE WHEN C# = '004' AND score >=?60?THEN?1?ELSE?0?END)/SUM(CASE WHEN C# = '004' THEN?1?ELSE?0?END) AS 数据库及格百分数 ?FROM SC 21、查询不同老师所教不同课程平均分从高到低显示 ?SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(score) AS 平均成绩 ????FROM SC AS T,Course AS C,Teacher AS Z ????where T.C#=C.C# and C.T#=Z.T# ?GROUP BY C.C# ?ORDER BY AVG(score) DESC 22、查询如下课程成绩第?3?名到第?6?名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004) ????[学生ID],[学生姓名],马克思,UML,平均成绩 ????SELECT?DISTINCT top?3 ????? SC.S#?As 学生学号, ??????? Student.Sname?AS 学生姓名, ????? T1.score?AS 企业管理, ????? T2.score?AS 马克思, ????? T3.score?AS UML, ????? T4.score?AS 数据库, ??????ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分 ??????FROM Student,SC?LEFT JOIN SC AS T1 ??????????????????????ON SC.S# = T1.S# AND T1.C# = '001' ????????????LEFT JOIN SC AS T2 ??????????????????????ON SC.S# = T2.S# AND T2.C# = '002' ????????????LEFT JOIN SC AS T3 ??????????????????????ON SC.S# = T3.S# AND T3.C# = '003' ????????????LEFT JOIN SC AS T4 ??????????????????????ON SC.S# = T4.S# AND T4.C# = '004' ??????WHERE student.S#=SC.S# and ??????ISNULL(T1.score,0) ??????NOT IN ????? (SELECT ????????????DISTINCT ????????????TOP?15?WITH TIES ????????????ISNULL(T1.score,0) ??????FROM sc ????????????LEFT JOIN sc AS T1 ??????????????????????ON sc.S# = T1.S# AND T1.C# = 'k1' ???????????LEFT JOIN sc AS T2 ??????????????????????ON sc.S# = T2.S# AND T2.C# = 'k2' ????????????LEFT JOIN sc AS T3 ??????????????????????ON sc.S# = T3.S# AND T3.C# = 'k3' ????????????LEFT JOIN sc AS T4 ??????????????????????ON sc.S# = T4.S# AND T4.C# = 'k4' ??????ORDER BY ISNULL(T1.score,0) DESC); 23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60] ????SELECT SC.C# as 课程ID,Cname as 课程名称 ???????,SUM(CASE WHEN score BETWEEN?85?AND?100?THEN?1?ELSE?0?END) AS [100 - 85] ???????,SUM(CASE WHEN score BETWEEN?70?AND?85?THEN?1?ELSE?0?END) AS [85 - 70] ???????,SUM(CASE WHEN score BETWEEN?60?AND?70?THEN?1?ELSE?0?END) AS [70 - 60] ???????,SUM(CASE WHEN score <?60?THEN?1?ELSE?0?END) AS [60 -] ????FROM SC,Course ????where SC.C#=Course.C# ????GROUP BY SC.C#,Cname; 24、查询学生平均成绩及其名次 ??????SELECT?1+(SELECT COUNT( distinct 平均成绩) ??????????????FROM (SELECT S#,AVG(score) AS 平均成绩 ??????????????????????FROM SC ??????????????????GROUP BY S# ????????????????? )?AS T1 ????????????WHERE 平均成绩 > T2.平均成绩) as 名次, ????? S#?as 学生学号,平均成绩 ????FROM (SELECT S#,AVG(score) 平均成绩 ????????????FROM SC ????????GROUP BY S# ??????? )?AS T2 ????ORDER BY 平均成绩 desc; 25、查询各科成绩前三名的记录:(不考虑成绩并列情况) ??????SELECT t1.S# as 学生ID,t1.C# as 课程ID,score as 分数 ??????FROM SC t1 ??????WHERE score IN (SELECT TOP?3?score ??????????????FROM SC ??????????????WHERE t1.C#= C# ????????????ORDER BY score DESC ????????????? ) ??????ORDER BY t1.C#; 26、查询每门课程被选修的学生数 ?select c#,count(S#) from sc group by C#; 27、查询出只选修了一门课程的全部学生的学号和姓名 ?select SC.S#,count(C#) AS 选课数 ?from SC,Student ?where SC.S#=Student.S# group by SC.S#,Student.Sname having count(C#)=1; 28、查询男生、女生人数 ????Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男'; ????Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女'; 29、查询姓“张”的学生名单 ????SELECT Sname FROM Student WHERE Sname like '张%'; 30、查询同名同性学生名单,并统计同名人数 ?select Sname,count(*) from Student group by Sname having?count(*)>1;; 31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime) ????select Sname,?CONVERT(char (11),DATEPART(year,Sage)) as age ????from student ????where?CONVERT(char(11),Sage))='1981'; 32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列 ????Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ; 33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩 ????select Sname,SC.S#,avg(score) ????from Student,SC ????where Student.S#=SC.S# group by SC.S#,Sname having????avg(score)>85; 34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数 ????Select Sname,isnull(score,0) ????from Student,SC,Course ????where SC.S#=Student.S# and SC.C#=Course.C# and?Course.Cname='数据库'and score <60; 35、查询所有学生的选课情况; ????SELECT SC.S#,SC.C#,Cname ????FROM SC,Student,Course ????where SC.S#=Student.S# and SC.C#=Course.C# ; 36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数; ????SELECT?distinct student.S#,student.Sname,SC.score ????FROM student,Sc ????WHERE SC.score>=70?AND SC.S#=student.S#; 37、查询不及格的课程,并按课程号从大到小排列 ????select c# from sc where scor e <60?order by C# ; 38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; ????select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and score>80?and C#='003'; 39、求选了课程的学生人数 ????select count(*) from sc; 40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩 ????select Student.Sname,score ????from Student,Course C,Teacher ????where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# ); 41、查询各个课程及相应的选修人数 ????select count(*) from sc group by C#; 42、查询不同课程成绩相同的学生的学号、课程号、学生成绩 ?select distinct?A.S#,B.score from SC A?,SC B where A.score=B.score and A.C# <>B.C# ; 43、查询每门功成绩最好的前两名 ????SELECT t1.S# as 学生ID,score as 分数 ??????FROM SC t1 ??????WHERE score IN (SELECT TOP?2?score ??????????????FROM SC ??????????????WHERE t1.C#= C# ????????????ORDER BY score DESC ????????????? ) ??????ORDER BY t1.C#; 44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列? ????select?C# as 课程号,count(*) as 人数 ????from?sc? ????group?by?C# ????order?by?count(*) desc,c#? 45、检索至少选修两门课程的学生学号 ?? ?select?S#? ????from?sc? ????group?by?s# ????having?count(*)?>?=?2 46、查询全部学生都选修的课程的课程号和课程名 ????select?C#,Cname? ????from?Course? ????where?C#?in?(select?c#?from?sc group?by?c#)? 47、查询没学过“叶平”老师讲授的任一门课程的学生姓名 ????select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平'); 48、查询两门以上不及格课程的同学的学号及其平均成绩 ????select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60?group by S# having count(*)>2)group by S#; 49、检索“004”课程分数小于60,按分数降序排列的同学学号 ????select S# from SC where C#='004'and score <60?order by score desc; 50、删除“002”同学的“001”课程的成绩 delete from Sc where S#='001'and C#='001'; 经典sql语句大全 一、基础 1、说明:创建数据库 根据已有的表创建新表:? 13、对数据库进行操作: 二、提升 1、说明:复制表(只复制结构,源表名:a?新表名:b) (Access可用) 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) 4、说明:子查询(表名1:a?表名2:b) 5、说明:显示文章、提交人和最后回复时间 6、说明:外连接查询(表名1:a?表名2:b) 7、说明:在线视图查询(表名1:a ) 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 9、说明:in?的使用方法 10、说明:两张关联表,删除主表中已经在副表中没有的信息? 11、说明:四表联查问题: 12、说明:日程安排提前五分钟提醒? 13、说明:一条sql?语句搞定数据库分页 ??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条记录 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) 16、说明:包括所有在?TableA中但不在?TableB和TableC中的行并消除所有重复行而派生出一个结果表 17、说明:随机取出10条数据 18、说明:随机选择记录 19、说明:删除重复记录 alter table?tablename 20、说明:列出数据库里所有的表名 21、说明:列出表里的所有的列名 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select?中的case。 23、说明:初始化表table1 TRUNCATE TABLE table1 24、说明:选择从10到15的记录 三、技巧 1、1=1,1=2的使用,在sql语句组合时用的较多 “where 1=1”?是表示选择全部??? “where 1=2”全部不选, 我们可以直接写成 错误!未找到目录项。 3、压缩数据库 4、转移数据库给新用户以已存在用户权限 5、检查备份集 6、修复数据库 7、日志清除 USE tablename --?要操作的数据库名 Setup / initialize
DBCC SHRINKFILE (@LogicalFileName,@NewSize) 8、说明:更改某个表 9、存储更改全部表 CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch DECLARE @Name??? as NVARCHAR(128) DECLARE curObject CURSOR FOR? OPEN?? curObject FETCH NEXT FROM curObject INTO @Name,@Owner close curObject
????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 数据开发-经典 1.按姓氏笔画排序: 2.数据库加密: 3.取回表中字段: 4.查看硬盘分区: 5.比较A,B表是否相等: 6.杀掉所有的事件探察器进程: 7.记录搜索: ?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:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。 print?@s??????exec??sp_executesql??@s 9:获取当前数据库中的所有用户表 10:获取某一个表的所有字段 select name from?syscolumns?where id in (select id from?sysobjects?where type = 'u' and name = '表名') 两种方式的效果相同 11:查看与某一个表相关的视图、存储过程、函数 12:查看当前数据库中所有存储过程 13:查询用户创建的所有数据库 14:查询某一个表的字段和数据类型 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 ',数据库名.dbo.表名) --把本地表导入远程表 insert openrowset( 'sqlOLEDB ',数据库名.dbo.表名) select *from?本地表 --更新本地表 update b set b.列A=a.列A ?from openrowset( 'sqlOLEDB ',数据库名.dbo.表名)as a inner join?本地表?b on a.column1=b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器 exec sp_addlinkedserver???'ITSV ','远程服务器名或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基本函数 1.字符串函数?长度与分析用 1,datalength(Char_expr)?返回字符串包含字符数,但不包含后面的空格 5,Sp_addtype自定義數據類型 6,set nocount {on|off} 使返回的结果中不包含有关受?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)?从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导 采用默认servernamePub (4) [下一步]?自定义配置 ?可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置否,使用下列默认设置(推荐) (5) [下一步]?设置分发数据库名称和位置 采用默认值 2、创建出版物 发布服务器B、C、D上 (1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令 但是在这里我们选择运行"sql SERVER 2000"的数据库服务器 (5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表 注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表 (6)选择发布名称和描述 (7)自定义发布属性 向导提供的选择: 是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性否 根据指定方式创建发布 (建议采用自定义的方式) (8)[下一步]?选择筛选发布的方式 (9)[下一步]?可以选择是否允许匿名订阅1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器 方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅如果仍然需要匿名订阅则用以下解决办法 [企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项]?选择允许匿名请求订阅2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示(10)[下一步]?设置快照 代理程序调度(11)[下一步]?完成配置 当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库有数据 srv1.库名..author有字段:id,name,phone,?srv2.库名..author有字段:id,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','用户名','密码' 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_processas --更新修改过的数据 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,telphone) select id,telphone from author iwhere 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 (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |