找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 15825|回复: 0

SQL基础大全

[复制链接]
发表于 2012-2-3 13:18:50 | 显示全部楼层 |阅读模式
  1. 一、基础
  2. 1、说明:创建数据库
  3. CREATE DATABASE
  4. database-name
  5. 2、说明:删除数据库
  6. drop database dbname
  7. 3、说明:备份sql server
  8. ---
  9. 创建 备份数据的 device
  10. USE master
  11. EXEC sp_addumpdevice 'disk', 'testBack',
  12. 'c:\mssql7backup\MyNwind_1.dat'
  13. --- 开始 备份
  14. BACKUP DATABASE pubs TO
  15. testBack
  16. 4、说明:创建新表
  17. create table tabname(col1 type1 [not null] [primary
  18. key],col2 type2 [not null],..)
  19. 根据已有的表创建新表:
  20. A:create table tab_new
  21. like tab_old (使用旧表创建新表)
  22. B:create table tab_new as select col1,col2… from
  23. tab_old definition only
  24. 5、说明:删除新表
  25. drop table
  26. tabname
  27. 6、说明:增加一个列
  28. Alter table tabname add column col
  29. type
  30. 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
  31. 7、说明:添加主键: Alter
  32. table tabname add primary key(col)
  33. 说明:删除主键: Alter table tabname drop primary
  34. key(col)
  35. 8、说明:创建索引:create [unique] index idxname on
  36. tabname(col….)
  37. 删除索引:drop index
  38. idxname
  39. 注:索引是不可更改的,想更改必须删除重新建。
  40. 9、说明:创建视图:create view viewname as select
  41. statement
  42. 删除视图:drop view viewname
  43. 10、说明:几个简单的基本的sql语句
  44. 选择:select * from
  45. table1 where 范围
  46. 插入:insert into table1(field1,field2)
  47. values(value1,value2)
  48. 删除:delete from table1 where 范围
  49. 更新:update table1 set
  50. field1=value1 where 范围
  51. 查找:select * from table1 where field1 like ’%value1%’
  52. ---like的语法很精妙,查资料!
  53. 排序:select * from table1 order by field1,field2
  54. [desc]
  55. 总数:select count as totalcount from table1
  56. 求和:select sum(field1) as
  57. sumvalue from table1
  58. 平均:select avg(field1) as avgvalue from
  59. table1
  60. 最大:select max(field1) as maxvalue from table1
  61. 最小:select min(field1)
  62. as minvalue from table1
  63. 11、说明:几个高级查询运算词
  64. A: UNION 运算符
  65. UNION
  66. 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即
  67. UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
  68. B: EXCEPT
  69. 运算符
  70. EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT
  71. 一起使用时 (EXCEPT ALL),不消除重复行。
  72. C: INTERSECT 运算符
  73. INTERSECT 运算符通过只包括 TABLE1 和
  74. TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT
  75. ALL),不消除重复行。
  76. 注:使用运算词的几个查询结果行必须是一致的。
  77. 12、说明:使用外连接
  78. A、left (outer)
  79. join:
  80. 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
  81. SQL: select a.a, a.b, a.c,
  82. b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
  83. B:right (outer)
  84. join:
  85. 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
  86. C:full/cross (outer)
  87. join:
  88. 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
  89. 12、分组:Group by:
  90.   一张表,一旦分组
  91. 完成后,查询后只能得到组相关的信息。
  92.     组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
  93.   
  94. 在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
  95.   
  96. 在selecte统计函数中的字段,不能和普通的字段放在一起;
  97. 13、对数据库进行操作:
  98.    分离数据库:
  99. sp_detach_db; 附加数据库:sp_attach_db
  100. 后接表明,附加需要完整的路径名
  101. 14.如何修改数据库的名称:
  102. sp_renamedb 'old_name',
  103. 'new_name'
  104. 二、提升
  105. 1、说明:复制表(只复制结构,源表名:a 新表名:b)
  106. (Access可用)
  107. 法一:select * into b from a where
  108. 1<>1(仅用于SQlServer)
  109. 法二:select top 0 * into b from
  110. a
  111. 2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
  112. insert into b(a, b, c) select
  113. d,e,f from b;
  114. 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
  115. insert into
  116. b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
  117. 例子:..from b in
  118. '"&Server.MapPath(".")&"\data.mdb" &"'
  119. where..
  120. 4、说明:子查询(表名1:a 表名2:b)
  121. select a,b,c from a where a IN
  122. (select d from b ) 或者: select a,b,c from a where a IN
  123. (1,2,3)
  124. 5、说明:显示文章、提交人和最后回复时间
  125. select a.title,a.username,b.adddate
  126. from table a,(select max(adddate) adddate from table where table.title=a.title)
  127. b
  128. 6、说明:外连接查询(表名1:a 表名2:b)
  129. select a.a, a.b, a.c, b.c, b.d, b.f from
  130. a LEFT OUT JOIN b ON a.a = b.c
  131. 7、说明:在线视图查询(表名1:a )
  132. select * from
  133. (SELECT a,b,c FROM a) T where t.a >
  134. 1;
  135. 8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
  136. select *
  137. from table1 where time between time1 and time2
  138. select a,b,c, from table1
  139. where a not between 数值1 and 数值2
  140. 9、说明:in 的使用方法
  141. select * from table1
  142. where a [not] in
  143. (‘值1’,’值2’,’值4’,’值6’)
  144. 10、说明:两张关联表,删除主表中已经在副表中没有的信息
  145. delete from
  146. table1 where not exists ( select * from table2 where table1.field1=table2.field1
  147. )
  148. 11、说明:四表联查问题:
  149. select * from a left inner join b on a.a=b.b right
  150. inner join c on a.a=c.c inner join d on a.a=d.d where
  151. .....
  152. 12、说明:日程安排提前五分钟提醒
  153. SQL: select * from 日程安排 where
  154. datediff('minute',f开始时间,getdate())>5
  155. 13、说明:一条sql
  156. 语句搞定数据库分页
  157. select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by
  158. 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by
  159. a.排序字段
  160. 具体实现:
  161. 关于数据库分页:
  162. declare @start int,@end
  163. int
  164. @sql nvarchar(600)
  165. set @sql=’select
  166. top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid
  167. from T where Rid>-1)’
  168. exec sp_executesql
  169. @sql
  170. 注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免
  171. top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
  172. 14、说明:前10条记录
  173. select
  174. top 10 * form table1 where
  175. 范围
  176. 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
  177. select
  178. a,b,c from tablename ta where a=(select max(a) from tablename tb where
  179. tb.b=ta.b)
  180. 16、说明:包括所有在 TableA 中但不在 TableB和TableC
  181. 中的行并消除所有重复行而派生出一个结果表
  182. (select a from tableA ) except (select a from tableB)
  183. except (select a from tableC)
  184. 17、说明:随机取出10条数据
  185. select top 10 * from
  186. tablename order by newid()
  187. 18、说明:随机选择记录
  188. select
  189. newid()
  190. 19、说明:删除重复记录
  191. 1),delete from tablename where id not in
  192. (select max(id) from tablename group by col1,col2,...)
  193. 2),select distinct *
  194. into temp from tablename
  195. delete from tablename
  196. insert into tablename
  197. select * from temp
  198. 评价:
  199. 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
  200. 3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
  201. alter
  202. table tablename
  203. --添加一个自增列
  204. add column_b int identity(1,1)
  205. delete from
  206. tablename where column_b not in(
  207. select max(column_b) from tablename group by
  208. column1,column2,...)
  209. alter table tablename drop column
  210. column_b
  211. 20、说明:列出数据库里所有的表名
  212. select name from sysobjects where
  213. type='U' // U代表用户
  214. 21、说明:列出表里的所有的列名
  215. select name from syscolumns
  216. where
  217. id=object_id('TableName')
  218. 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select
  219. 中的case。
  220. select type,sum(case vender when 'A' then pcs else 0 end),sum(case
  221. vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0
  222. end) FROM tablename group by type
  223. 显示结果:
  224. type vender pcs
  225. 电脑 A 1
  226. 电脑 A
  227. 1
  228. 光盘 B 2
  229. 光盘 A 2
  230. 手机 B 3
  231. 手机 C
  232. 3
  233. 23、说明:初始化表table1
  234. TRUNCATE TABLE
  235. table1
  236. 24、说明:选择从10到15的记录
  237. select top 5 * from (select top 15 * from
  238. table order by id asc) table_别名 order by id
  239. desc
  240. 三、技巧
  241. 1、1=1,1=2的使用,在SQL语句组合时用的较多
  242. “where
  243. 1=1” 是表示选择全部    “where 1=2”全部不选,
  244. 如:
  245. if @strWhere !=''
  246. begin
  247. set
  248. @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' +
  249. @strWhere
  250. end
  251. else
  252. begin
  253. set @strSQL = 'select count(*) as Total
  254. from [' + @tblName +
  255. ']'
  256. end
  257. 我们可以直接写成
  258. 错误!未找到目录项。
  259. set @strSQL = 'select
  260. count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
  261. 2、收缩数据库
  262. --重建索引
  263. DBCC REINDEX
  264. DBCC INDEXDEFRAG
  265. --收缩数据和日志
  266. DBCC
  267. SHRINKDB
  268. DBCC SHRINKFILE
  269. 3、压缩数据库
  270. dbcc
  271. shrinkdatabase(dbname)
  272. 4、转移数据库给新用户以已存在用户权限
  273. exec
  274. sp_change_users_login
  275. 'update_one','newname','oldname'
  276. go
  277. 5、检查备份集
  278. RESTORE VERIFYONLY
  279. from disk='E:\dvbbs.bak'
  280. 6、修复数据库
  281. ALTER DATABASE [dvbbs] SET
  282. SINGLE_USER
  283. GO
  284. DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH
  285. TABLOCK
  286. GO
  287. ALTER DATABASE [dvbbs] SET
  288. MULTI_USER
  289. GO
  290. 7、日志清除
  291. SET NOCOUNT ON
  292. DECLARE @LogicalFileName
  293. sysname,
  294. @MaxMinutes INT,
  295. @NewSize INT
  296. USE tablename
  297. -- 要操作的数据库名
  298. SELECT  @LogicalFileName = 'tablename_log', --
  299. 日志文件名
  300. @MaxMinutes = 10, -- Limit on time allowed to wrap log.
  301. @NewSize =
  302. 1  -- 你想设定的日志文件的大小(M)
  303. Setup / initialize
  304. DECLARE @OriginalSize
  305. int
  306. SELECT @OriginalSize = size
  307. FROM sysfiles
  308. WHERE name =
  309. @LogicalFileName
  310. SELECT 'Original Size of ' + db_name() + ' LOG is '
  311. +
  312. CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or '
  313. +
  314. CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
  315. FROM
  316. sysfiles
  317. WHERE name = @LogicalFileName
  318. CREATE TABLE
  319. DummyTrans
  320. (DummyColumn char (8000) not null)
  321. DECLARE
  322. @Counter    INT,
  323. @StartTime DATETIME,
  324. @TruncLog   VARCHAR(255)
  325. SELECT
  326. @StartTime = GETDATE(),
  327. @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH
  328. TRUNCATE_ONLY'
  329. DBCC SHRINKFILE (@LogicalFileName, @NewSize)
  330. EXEC
  331. (@TruncLog)
  332. -- Wrap the log if necessary.
  333. WHILE @MaxMinutes > DATEDIFF
  334. (mi, @StartTime, GETDATE()) -- time has not expired
  335. AND @OriginalSize =
  336. (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
  337. AND
  338. (@OriginalSize * 8 /1024) > @NewSize  
  339. BEGIN -- Outer loop.
  340. SELECT
  341. @Counter = 0
  342. WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter <
  343. 50000))
  344. BEGIN -- update
  345. INSERT DummyTrans VALUES ('Fill Log') DELETE
  346. DummyTrans
  347. SELECT @Counter = @Counter + 1
  348. END
  349. EXEC (@TruncLog)
  350. END
  351. SELECT 'Final Size of ' + db_name() + ' LOG is '
  352. +
  353. CONVERT(VARCHAR(30),size) + ' 8K pages or '
  354. +
  355. CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
  356. FROM sysfiles
  357. WHERE
  358. name = @LogicalFileName
  359. DROP TABLE DummyTrans
  360. SET NOCOUNT
  361. OFF
  362. 8、说明:更改某个表
  363. exec sp_changeobjectowner
  364. 'tablename','dbo'
  365. 9、存储更改全部表
  366. CREATE PROCEDURE
  367. dbo.User_ChangeObjectOwnerBatch
  368. @OldOwner as NVARCHAR(128),
  369. @NewOwner as
  370. NVARCHAR(128)
  371. AS
  372. DECLARE @Name    as NVARCHAR(128)
  373. DECLARE
  374. @Owner   as NVARCHAR(128)
  375. DECLARE @OwnerName   as
  376. NVARCHAR(128)
  377. DECLARE curObject CURSOR FOR
  378. select 'Name'    =
  379. name,
  380.    'Owner'    = user_name(uid)
  381. from sysobjects
  382. where
  383. user_name(uid)=@OldOwner
  384. order by name
  385. OPEN   curObject
  386. FETCH
  387. NEXT FROM curObject INTO @Name, @Owner
  388. WHILE(@@FETCH_STATUS=0)
  389. BEGIN   
  390.   
  391. if @Owner=@OldOwner
  392. begin
  393.    set @OwnerName = @OldOwner + '.' +
  394. rtrim(@Name)
  395.    exec sp_changeobjectowner @OwnerName, @NewOwner
  396. end
  397. --
  398. select @name,@NewOwner,@OldOwner
  399. FETCH NEXT FROM curObject INTO
  400. @Name, @Owner
  401. END
  402. close curObject
  403. deallocate
  404. curObject
  405. GO
  406. 10、SQL SERVER中直接循环写入数据
  407. declare @i
  408. int
  409. set @i=1
  410. while @i<30
  411. begin
  412.     insert into test (userid)
  413. values(@i)
  414.     set
  415. @i=@i+1
  416. end
  417. 案例:
  418. 有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
  419.   
  420.   Name     score
  421.     Zhangshan   80
  422.     Lishi      
  423. 59
  424.     Wangwu      50
  425.     Songquan   
  426. 69
  427. while((select min(score) from
  428. tb_table)<60)
  429. begin
  430. update tb_table set score
  431. =score*1.01
  432. where score<60
  433. if (select min(score) from
  434. tb_table)>60
  435. break
  436. else
  437.    
  438. continue
  439. end
  440. 数据开发-经典
  441. 1.按姓氏笔画排序:
  442. Select
  443. * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
  444. //从少到多
  445. 2.数据库加密:
  446. select encrypt('原始密码')
  447. select
  448. pwdencrypt('原始密码')
  449. select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同
  450. encrypt('原始密码')
  451. select pwdencrypt('原始密码')
  452. select
  453. pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同
  454. 3.取回表中字段:
  455. declare @list
  456. varchar(1000),
  457. @sql nvarchar(1000)
  458. select @list=@list+','+b.name from
  459. sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
  460. set @sql='select
  461. '+right(@list,len(@list)-1)+' from 表A'
  462. exec
  463. (@sql)
  464. 4.查看硬盘分区:
  465. EXEC
  466. master..xp_fixeddrives
  467. 5.比较A,B表是否相等:
  468. if (select
  469. checksum_agg(binary_checksum(*)) from A)
  470.      =
  471.     (select
  472. checksum_agg(binary_checksum(*)) from B)
  473. print '相等'
  474. else
  475. print
  476. '不相等'
  477. 6.杀掉所有的事件探察器进程:
  478. DECLARE hcforeach CURSOR GLOBAL FOR SELECT
  479. 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
  480. WHERE program_name IN('SQL
  481. profiler',N'SQL 事件探查器')
  482. EXEC sp_msforeach_worker
  483. '?'
  484. 7.记录搜索:
  485. 开头到N条记录
  486. Select Top N * From
  487. -------------------------------
  488. N到M条记录(要有主索引ID)
  489. Select Top M-N * From
  490. 表 Where ID in (Select Top M ID From 表) Order by ID   
  491. Desc
  492. ----------------------------------
  493. N到结尾记录
  494. Select Top N * From 表
  495. Order by ID Desc
  496. 案例
  497. 例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句,
  498. 找出表的第31到第40个记录。
  499. select top 10 recid from A where recid not in(select
  500. top 30 recid from A)
  501. 分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。
  502.    
  503. select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from
  504. A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。
  505. 解决方案
  506. 1,
  507. 用order by select top 30 recid from A order by ricid
  508. 如果该字段不是自增长,就会出现问题
  509. 2, 在那个子查询中也加条件:select top 30 recid from A where
  510. recid>-1
  511. 例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
  512. set @s = 'select
  513. top 1 * from T   where pid not in (select top ' + str(@count-1) + ' pid from
  514. T)'
  515. print @s      exec sp_executesql
  516. @s
  517. 9:获取当前数据库中的所有用户表
  518. select Name from sysobjects where xtype='u'
  519. and status>=0
  520. 10:获取某一个表的所有字段
  521. select name from syscolumns where
  522. id=object_id('表名')
  523. select name from syscolumns where id in (select id
  524. from sysobjects where type = 'u' and name =
  525. '表名')
  526. 两种方式的效果相同
  527. 11:查看与某一个表相关的视图、存储过程、函数
  528. select a.* from
  529. sysobjects a, syscomments b where a.id = b.id and b.text like
  530. '%表名%'
  531. 12:查看当前数据库中所有存储过程
  532. select name as 存储过程名称 from sysobjects
  533. where xtype='P'
  534. 13:查询用户创建的所有数据库
  535. select * from master..sysdatabases
  536. D where sid not in(select sid from master..syslogins where
  537. name='sa')
  538. 或者
  539. select dbid, name AS DB_NAME from master..sysdatabases where
  540. sid <> 0x01
  541. 14:查询某一个表的字段和数据类型
  542. select column_name,data_type
  543. from information_schema.columns
  544. where table_name =
  545. '表名'
  546. 15:不同服务器数据库之间的数据操作
  547. --创建链接服务器
  548. exec
  549. sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
  550. exec
  551. sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码
  552. '
  553. --查询示例
  554. select * from
  555. ITSV.数据库名.dbo.表名
  556. --导入示例
  557. select * into 表 from
  558. ITSV.数据库名.dbo.表名
  559. --以后不再使用时删除链接服务器
  560. exec sp_dropserver
  561. 'ITSV ', 'droplogins
  562. '
  563. --连接远程/局域网数据(openrowset/openquery/opendatasource)
  564. --1、openrowset
  565. --查询示例
  566. select
  567. * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码
  568. ',数据库名.dbo.表名)
  569. --生成本地表
  570. select * into 表 from openrowset(
  571. 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码
  572. ',数据库名.dbo.表名)
  573. --把本地表导入远程表
  574. insert
  575. openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码
  576. ',数据库名.dbo.表名)
  577. select *from
  578. 本地表
  579. --更新本地表
  580. update b
  581. set
  582. b.列A=a.列A
  583. from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码
  584. ',数据库名.dbo.表名)as a inner join 本地表 b
  585. on
  586. a.column1=b.column1
  587. --openquery用法需要创建一个连接
  588. --首先创建一个连接创建链接服务器
  589. exec
  590. sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址
  591. '
  592. --查询
  593. select *
  594. FROM openquery(ITSV, 'SELECT
  595. * FROM 数据库.dbo.表名 ')
  596. --把本地表导入远程表
  597. insert openquery(ITSV,
  598. 'SELECT * FROM 数据库.dbo.表名 ')
  599. select * from
  600. 本地表
  601. --更新本地表
  602. update b
  603. set
  604. b.列B=a.列B
  605. FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as
  606. a
  607. inner join 本地表 b on
  608. a.列A=b.列A
  609. --3、opendatasource/openrowset
  610. SELECT
  611.   *
  612. FROM   opendatasource( 'SQLOLEDB ', 'Data
  613. Source=ip/ServerName;User ID=登陆名;Password=密码 '
  614. ).test.dbo.roy_ta
  615. --把本地表导入远程表
  616. insert opendatasource(
  617. 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码
  618. ').数据库.dbo.表名
  619. select * from 本地表
  620. SQL
  621. Server基本函数
  622. SQL Server基本函数
  623. 1.字符串函数
  624. 长度与分析用
  625. 1,datalength(Char_expr)
  626. 返回字符串包含字符数,但不包含后面的空格
  627. 2,substring(expression,start,length)
  628. 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
  629. 3,right(char_expr,int_expr)
  630. 返回字符串右边第int_expr个字符,还用left于之相反
  631. 4,isnull( check_expression , replacement_value
  632. )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类
  633. 5,Sp_addtype
  634. 自定義數據類型
  635. 例如:EXEC sp_addtype birthday, datetime, 'NULL'
  636. 6,set
  637. nocount {on|off}
  638. 使返回的结果中不包含有关受 Transact-SQL
  639. 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT
  640. 设置是在执行或运行时设置,而不是在分析时设置。
  641. SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL
  642. 语句影响的行数)。
  643. SET NOCOUNT 为 OFF
  644. 时,返回计数
  645. 常识
  646. 在SQL查询中:from后最多可以跟多少张表或视图:256
  647. 在SQL语句中出现 Order
  648. by,查询时,先排序,后取
  649. 在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。
  650.   
  651.       
  652. SQLServer2000同步复制技术实现步骤
  653. 一、
  654. 预备工作
  655. 1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
  656. --管理工具
  657. --计算机管理
  658. --用户和组
  659. --右键用户
  660. --新建用户
  661. --建立一个隶属于administrator组的登陆windows的用户(SynUser)
  662. 2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
  663. 我的电脑--D:\
  664. 新建一个目录,名为:
  665. PUB
  666. --右键这个新建的目录
  667. --属性--共享
  668. --选择"共享该文件夹"
  669. --通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser)
  670. 具有对该文件夹的所有权限
  671. --确定
  672. 3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
  673. 开始--程序--管理工具--服务
  674. --右键SQLSERVERAGENT
  675. --属性--登陆--选择"此账户"
  676. --输入或者选择第一步中创建的windows登录用户名(SynUser)
  677. --"密码"中输入该用户的密码
  678. 4.设置SQL
  679. Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
  680. 企业管理器
  681. --右键SQL实例--属性
  682. --安全性--身份验证
  683. --选择"SQL
  684. Server 和 Windows"
  685. --确定
  686. 5.在发布服务器和订阅服务器上互相注册
  687. 企业管理器
  688. --右键SQL
  689. Server组
  690. --新建SQL Server注册...
  691. --下一步--可用的服务器中,输入你要注册的远程服务器名
  692. --添加
  693. --下一步--连接使用,选择第二个"SQL
  694. Server身份验证"
  695. --下一步--输入用户名和密码(SynUser)
  696. --下一步--选择SQL
  697. Server组,也可以创建一个新组
  698. --下一步--完成
  699. 6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)
  700. (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
  701. 开始--程序--Microsoft
  702. SQL
  703. Server--客户端网络实用工具
  704. --别名--添加
  705. --网络库选择"tcp/ip"--服务器别名输入SQL服务器名
  706. --连接参数--服务器名称中输入SQL服务器ip地址
  707. --如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
  708. 二、
  709. 正式配置
  710. 1、配置发布服务器
  711. 打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:
  712. (1)
  713. 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导
  714. (2) [下一步] 选择分发服务器
  715. 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)
  716. (3) [下一步]
  717. 设置快照文件夹
  718. 采用默认\\servername\Pub
  719. (4) [下一步]
  720. 自定义配置
  721. 可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置
  722. 否,使用下列默认设置(推荐)
  723. (5) [下一步]
  724. 设置分发数据库名称和位置 采用默认值
  725. (6) [下一步] 启用发布服务器 选择作为发布的服务器
  726. (7) [下一步]
  727. 选择需要发布的数据库和发布类型
  728. (8) [下一步] 选择注册订阅服务器
  729. (9) [下一步]
  730. 完成配置
  731. 2、创建出版物
  732. 发布服务器B、C、D上
  733. (1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令
  734. (2)选择要创建出版物的数据库,然后单击[创建发布]
  735. (3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
  736. (4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,
  737. SQLSERVER允许在不同的数据库如
  738. orACLE或ACCESS之间进行数据复制。
  739. 但是在这里我们选择运行"SQL SERVER
  740. 2000"的数据库服务器
  741. (5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
  742. 注意: 如果前面选择了事务发布
  743. 则再这一步中只能选择带有主键的表
  744. (6)选择发布名称和描述
  745. (7)自定义发布属性 向导提供的选择:
  746. 我将自定义数据筛选,启用匿名订阅和或其他自定义属性
  747. 否 根据指定方式创建发布 (建议采用自定义的方式)
  748. (8)[下一步]
  749. 选择筛选发布的方式
  750. (9)[下一步] 可以选择是否允许匿名订阅
  751. 1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器
  752. 方法:
  753. [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器]
  754. 中添加
  755. 否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅
  756. 如果仍然需要匿名订阅则用以下解决办法
  757. [企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项]
  758. 选择允许匿名请求订阅
  759. 2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示
  760. (10)[下一步] 设置快照 代理程序调度
  761. (11)[下一步]
  762. 完成配置
  763. 当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库
  764. 有数据
  765. srv1.库名..author有字段:id,name,phone,
  766. srv2.库名..author有字段:id,name,telphone,adress
  767. 要求:
  768. srv1.库名..author增加记录则srv1.库名..author记录增加
  769. srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
  770. --*/
  771. --大致的处理步骤
  772. --1.在
  773. srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
  774. exec sp_addlinkedserver
  775. 'srv2','','SQLOLEDB','srv2的sql实例名或ip'
  776. exec sp_addlinkedsrvlogin
  777. 'srv2','false',null,'用户名','密码'
  778. go
  779. --2.在 srv1 和 srv2 这两台电脑中,启动
  780. msdtc(分布式事务处理服务),并且设置为自动启动
  781. 。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction
  782. Coordinator--属性--启动--并将启动类型设置为自动启动
  783. go
  784. --然后创建一个作业定时调用上面的同步处理存储过程就行了
  785. 企业管理器
  786. --管理
  787. --SQL
  788. Server代理
  789. --右键作业
  790. --新建作业
  791. --"常规"项中输入作业名称
  792. --"步骤"项
  793. --新建
  794. --"步骤名"中输入步骤名
  795. --"类型"中选择"Transact-SQL
  796. 脚本(TSQL)"
  797. --"数据库"选择执行命令的数据库
  798. --"命令"中输入要执行的语句: exec
  799. p_process
  800. --确定
  801. --"调度"项
  802. --新建调度
  803. --"名称"中输入调度名称
  804. --"调度类型"中选择你的作业执行安排
  805. --如果选择"反复出现"
  806. --点"更改"来设置你的时间安排
  807. 然后将SQL
  808. Agent服务启动,并设置为自动启动,否则你的作业不会被执行
  809. 设置方法:
  810. 我的电脑--控制面板--管理工具--服务--右键
  811. SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
  812. --3.实现同步处理的方法2,定时同步
  813. --在srv1中创建如下的同步处理存储过程
  814. create
  815. proc p_process
  816. as
  817. --更新修改过的数据
  818. update b set
  819. name=i.name,telphone=i.telphone
  820. from srv2.库名.dbo.author b,author i
  821. where
  822. b.id=i.id and
  823. (b.name <> i.name or b.telphone <>
  824. i.telphone)
  825. --插入新增的数据
  826. insert
  827. srv2.库名.dbo.author(id,name,telphone)
  828. select id,name,telphone from author
  829. i
  830. where not exists(
  831. select * from srv2.库名.dbo.author where
  832. id=i.id)
  833. --删除已经删除的数据(如果需要的话)
  834. delete b
  835. from srv2.库名.dbo.author
  836. b
  837. where not exists(
  838. select * from author where id=b.id)
  839. go
  840. 作者:huahuagongzi9999 发表于2012-2-3 9:48:55 原文链接
复制代码

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-20 05:42 , Processed in 0.034122 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表