首頁  >  文章  >  後端開發  >  經典SQL語句大全

經典SQL語句大全

WBOY
WBOY原創
2016-08-08 09:28:581116瀏覽

一、基礎

1、說明:建立資料庫
CREATE DATABASE database-name 
2、說明:刪除資料庫
2
、說明:刪除資料庫 sql server --- 
創建備份資料的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwin_1.P. ack
 

4
、說明:建立新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],type1 [not null] [primary key],col2 type2 [not null],..)

根據現有的表建立新表: 
A:create table tab_new like tab_old (使用舊表建立新表)
B:create table
5、說明:刪除新表
drop table tabname 
6、說明:增加一個欄位table
6
列增加後將無法刪除。 DB2中列加上後資料型別也不能改變,唯一能改變的是增加varchar型別的長度。 7、說明:新增主鍵: 
Alter table tabname add primary key(col) 說明:刪除主鍵: Alter table tabname drop primary key(colcol) [unique] index idxname on tabname(col….) 刪除索引:drop index idxname
註:索引是無法更改的,想更改必須刪除重新建置。
9
、說明:建立視圖:create view viewname as select statement 

刪除視圖:drop view viewname
10刪除視圖:drop view viewname
10語10 select * from table1 where 
範圍插入:
insert into table1(field1,field2) values(value1,value2)刪除:delete from table1 where 範圍🜎 1= value1 期間by field1,field2 [desc]總數:select count as totalcount from table1求和:
select sum(field1) as sumvalue from table1
select max(field1) as maxvalue from table1
最小:
select min(field1) as minvalue from table111 ION運算子
 UNION 運算子透過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而衍生出一個結果表。當 ALL 隨 UNION 一起使用時(即 UNION ALL),則不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2 
B: EXCEPT 運算子
 
EXCEPT
 

EXCEPT 當 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_detach_db 如何修改資料庫的名稱:
sp_renamedb 'old_name', 'new_name'
 

二、提升

1、說明:複製表(只複製結構,來源表名:a 新表名:b) (Access可用

)法一:select * into b from a
法一:select * into b from a where 1
法二:select top 0 * into b from a
2、說明:拷貝表(五拷貝資料來源表名:a 表名:b) (a 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 '具體資料庫' 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 tabletle where table.ti= a.title) b

6、說明:外連接查詢(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LE OUT c.f from aINc.

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 atableb, where a not between 數值1 and 數值2

9、說明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)1’,’值2’,’值4’,’值6’)

1’,’值2’,’值4’,’值6’)1’,’值2’,’值4’,’值6’)1’,’值2’,’值4’,’ )
10、說明:兩張關聯表,刪除主表中已經在副表中沒有的資訊

 delete from table1 where not exists ( select * from table2 where table1.115
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 
12、說明:行程提前五分鐘提醒

 SQL: select * from 行程安排 where datediff('minute',f開始時間,getdate()>5)
))> 13、說明:一條sql 語句搞定資料庫分頁select top 10 b.* from (select top 20 主鍵欄位order 排序欄位表名c) 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 table) except (select a fromcept 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,colcol2,ct),. * into temp from tablename

  delete from tablename
  insert into tablename.資料操作
3),例如:在一個外部表中導入數據,由於某些原因第一次只導入了一部分,但很難判斷具體位置,這樣只有在下一次全部導入,這樣也就產生很多重複的字段,怎麼刪除重複字段
alter table 

tablename

--新增一個自增列
add  column_b int identity(1,1,1)
nnot not fo​​n00,1,1) 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
電腦
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_別名 de  by id de  by id de 

三、技巧

1、1=1,1=2的使用,在SQL語句組合時用的較多

「where 1=1」 是表示選擇全部    「where 1=2」全部不選,
如:

if @strWhere !='' 

be

as Total from [' + @tblName + '] where ' + @strWhere 

endelse begin

set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 

我們可以直接寫成
錯誤!未找到目錄項。

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 

安定 '+ @strWhere 2

、收縮資料庫
安定 '+ @strWhere 2
、收縮資料庫

安定

DBCC REINDEX

DBCC INDEXDEFRAG

--收縮資料和日誌
DBCC SHRINKDBDBCC SHRINKFILEDBCC SHRINKDBDBCC SHRINKFILE
DBCC SHRINKDBDBCC SHRINKFILEDBCC SHRINKDB
DBCC SHRINKFILE
DBCC SHRINKDB
DBCC SHRINKFILE

3
、壓縮資料庫

dbcc shrinkdatabase(dbname) 4
、轉移資料庫給新使用者以已存在使用者權限

exec sp_change_users_login 'update_one','newname','oldname'<span>go</span>
5
、檢查備份集

RESTORE VERIFYONLY from disk='E:dvbbs.bak'

6、修復資料庫
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_loss_loss) 8343%
GO

7

、日誌清除SET NOCOUNT ON
DECLARE @LogicalFileName sysname, @MaxMinutes INT,
 @NewSize INT
 @MaxMinutes INT,
 @NewSize INT


USE tablename -- USE tablename -- 
要操作的資料庫名稱SELECT  @LogicalFileName = 'tablename_log', -- 
日誌檔案名稱
Limon 對 w帶 % 7_h.
 @NewSize = 1  -- 你想設定的記錄檔的大小(M)


Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT 類型
RCHAR(30), @OriginalSize) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
 FROM sysfiles
 WHERE name = @LogicalFiles🎎 ) not null)


DECLARE @Counter    INT, @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @uncTime = GETDATE(),, Logo🎭

DBCC SHRINKFILE (@LogicalFileName, @NewSize)

EXEC (@TruncLog)

-- Wrap the log if necessary.WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE() times --MaxMinutes -- DATEDIFF (mi, @StartTime, GETDATE() time GETD. @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
 AND (@OriginalSize * 8 /1024) > @NewSize  
 BEGIN -- Outer lCounter lCounterd / 16) AND (@Counter  BEGIN -- update
 INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
 SELECT @Counter = @Counter + 1🎠
 inal 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
whereuser name(uid)
from sysobjects
whereuser name(uid)=Ofrom sysobjects

whereuser name(f

OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN     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 @ibe test

set @i=1

while @ibe (test🠎) test🠎) (素)。     set @i=@i+1end
案例



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

    Name     score

    Zhangshan   80
    Lishi       59

    Wangwu      50

    Songquan    69

while((select min(score) from tb_table)

begin

update tb_table set score =score*1.01

where score

if  (select min(score) from tb_table)>60

  break

 else

    continue

end

 

資料開發-經典


1.按姓氏筆畫排序:
Select * From TableName Order By CustomerName Collat​​e Chinese_PRC_Stroke_ci_as //從少到多

2.資料庫加密:
select encrypt('原始密碼
')
select pwdencrypt('原始密碼
')
select pwdencrypt('原始密碼
')
select pwdencrypt('原始密碼
')
select pwddare' --相同;否則不相同 encrypt('原始密碼

')select pwdencrypt('原始密碼')select pwdcompare('原始密碼','加密後密碼') = 1--相同;否則不相同
3.

取回表中欄位
:
declare @list varchar(1000),
@sql nvarchar(1000) select @list=list, s'sql nvarchar(1000) select @list=list, _objectdfdob syscolumns b where a.id=b.id and a.name='

A'

set @sql='select '+right(@list,len(@list)-1)+' from表Aexec (@sql)
4.

查看硬碟分割區:EXEC master..xp_fixeddrives

5.

比較A,B表是否相等
:
if (select checksum_agg(binary_checksum(*)) from A)   
相等

'elseprint '不相等'
6.
殺掉所有的事件探勘器程序
:DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.com 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 F 表) 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'sa')🎟🎟 dbid, name AS DB_NAME from master..s
ysdatabases 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 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'

<code><span>6,set nocount {on|off}</span></code>
<span>使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。</span>
<span>SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。</span><br>
<span>SET NOCOUNT </span><span>为 OFF 时,返回计数</span>
<code><span>常识</span></code><code></code>
<code><span> </span></code>
<span><code>在SQL查询中:</code><code>from</code><code>后最多可以跟多少张表或视图:</code><code>256</code><code></code></span>
<span><code>在</code><code>SQL</code><code>语句中出现 </code><code>Order by</code><code>,</code><code>查询时,</code><code>先排序,后取</code></span>
<span><code>在</code><code>SQL</code><code>中,一个字段的最大容量是</code><code>8000</code><code>,而对于</code><code>nvarchar(4000)</code><code>,</code><code>由于</code><code>nvarchar</code><code>是Unicode码。  </code></span>
<code><span>        </span></code>
<code><span>SQLServer2000</span></code><span><code>同步复制技术实现步骤</code><code></code></span>
<code><span>一、 预备工作</span></code><code></code>
<span><code>1.</code><code>发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户</code></span>
<span><code>--</code><code>管理工具</code></span>
<span><code>--</code><code>计算机管理</code></span>
<span><code>--</code><code>用户和组</code></span>
<span><code>--</code><code>右键用户</code></span>
<span><code>--</code><code>新建用户</code></span>
<span><code>--</code><code>建立一个隶属于administrator组的登陆windows的用户(SynUser)</code></span>
<span><code>2.</code><code>在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:</code></span>
<code><span>我的电脑--D:\ 新建一个目录,名为: PUB</span></code>
<span><code>--</code><code>右键这个新建的目录</code></span>
<span><code>--</code><code>属性--共享</code></span>
<span><code>--</code><code>选择"共享该文件夹"</code></span>
<span><code>--</code><code>通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限</code></span>
<code><span> </span></code>
<span><code>--</code><code>确定</code></span>
<span><code>3.</code><code>设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)</code></span>
<code><span>开始--程序--管理工具--服务</span></code>
<span><code>--</code><code>右键SQLSERVERAGENT</code></span>
<span><code>--</code><code>属性--登陆--选择"此账户"</code></span>
<span><code>--</code><code>输入或者选择第一步中创建的windows登录用户名(SynUser)</code></span>
<span><code>--"</code><code>密码"中输入该用户的密码</code></span>
<span><code>4.</code><code>设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)</code></span>
<code><span>企业管理器</span></code>
<span><code>--</code><code>右键SQL实例--属性</code></span>
<span><code>--</code><code>安全性--身份验证</code></span>
<span><code>--</code><code>选择"SQL Server 和 Windows"</code></span>
<span><code>--</code><code>确定</code></span>
<span><code>5.</code><code>在发布服务器和订阅服务器上互相注册</code></span>
<code><span>企业管理器</span></code>
<span><code>--</code><code>右键SQL Server组</code></span>
<span><code>--</code><code>新建SQL Server注册...</code></span>
<span><code>--</code><code>下一步--可用的服务器中,输入你要注册的远程服务器名 --添加</code></span>
<span><code>--</code><code>下一步--连接使用,选择第二个"SQL Server身份验证"</code></span>
<span><code>--</code><code>下一步--输入用户名和密码(SynUser)</code></span>
<span><code>--</code><code>下一步--选择SQL Server组,也可以创建一个新组</code></span>
<span><code>--</code><code>下一步--完成</code></span>
<span><code>6.</code><code>对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)</code></span>
<span><code> (</code><code>在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)</code></span>
<code><span>开始--程序--Microsoft SQL Server--客户端网络实用工具</span></code>
<span><code>--</code><code>别名--添加</code></span>
<span><code>--</code><code>网络库选择"tcp/ip"--服务器别名输入SQL服务器名</code></span>
<span><code>--</code><code>连接参数--服务器名称中输入SQL服务器ip地址</code></span>
<span><code>--</code><code>如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号</code></span>
<code><span>二、 正式配置</span></code><code></code>
<span><code>1</code><code>、配置发布服务器</code></span>
<code><span>打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:</span></code>
<span><code>(1) </code><code>从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导 </code></span>
<span><code>(2) [</code><code>下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)</code></span>
<span><code>(3) [</code><code>下一步] 设置快照文件夹</code></span>
<code><span>采用默认\\servername\Pub</span></code>
<span><code>(4) [</code><code>下一步] 自定义配置 </code></span>
<code><span>可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置</span></code>
<code><span>否,使用下列默认设置(推荐)</span></code>
<span><code>(5) [</code><code>下一步] 设置分发数据库名称和位置 采用默认值</code></span>
<span><code>(6) [</code><code>下一步] 启用发布服务器 选择作为发布的服务器</code></span>
<span>(7) [下一步] 选择需要发布的数据库和发布类型</span>
<span><code>(8) [</code><code>下一步] 选择注册订阅服务器</code></span>
<span><code>(9) [</code><code>下一步] 完成配置</code></span>
<span><code>2</code><code>、创建出版物</code></span>
<code><span>发布服务器B、C、D上</span></code>
<span><code>(1)</code><code>从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令</code></span>
<span><code>(2)</code><code>选择要创建出版物的数据库,然后单击[创建发布]</code></span>
<span><code>(3)</code><code>在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)</code></span>
<span><code>(4)</code><code>单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,</code></span>
<span><code>SQLSERVER</code><code>允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。</code></span>
<code><span>但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器</span></code>
<span><code>(5)</code><code>单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表</code></span>
<code><span>注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表</span></code>
<span><code>(6)</code><code>选择发布名称和描述</code></span>
<span><code>(7)</code><code>自定义发布属性 向导提供的选择:</code></span>
<code><span>是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性</span></code>
<code><span>否 根据指定方式创建发布 (建议采用自定义的方式)</span></code>
<span><code>(8)[</code><code>下一步] 选择筛选发布的方式 </code></span>
<span><code>(9)[</code><code>下一步] 可以选择是否允许匿名订阅</code></span>
<span><code>1)</code><code>如果选择署名订阅,则需要在发布服务器上添加订阅服务器</code></span>
<code><span>方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加</span></code>
<code><span>否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅</span></code>
<code><span>如果仍然需要匿名订阅则用以下解决办法 </span></code>
<span><code>[</code><code>企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅</code></span>
<span><code>2)</code><code>如果选择匿名订阅,则配置订阅服务器时不会出现以上提示</code></span>
<span><code>(10)[</code><code>下一步] 设置快照 代理程序调度</code></span>
<span><code>(11)[</code><code>下一步] 完成配置</code></span>
<code><span>当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库</span></code>
<code><span>有数据 </span></code>
<span><code>srv1.</code><code>库名..author有字段:id,name,phone, </code></span>
<span><code>srv2.</code><code>库名..author有字段:id,name,telphone,adress </code></span>
<code><span> </span></code>
<code><span>要求: </span></code>
<span><code>srv1.</code><code>库名..author增加记录则srv1.库名..author记录增加 </code></span>
<span><code>srv1.</code><code>库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新 </code></span>
<code><span>--*/ </span></code>
<code><span> </span></code>
<span><code>--</code><code>大致的处理步骤 </code></span>
<span><code>--1.</code><code>在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步 </code></span>
<span><code>exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2</code><code>的sql实例名或ip' </code></span>
<span><code>exec sp_addlinkedsrvlogin 'srv2','false',null,'</code><code>用户名','密码' </code></span>
<code><span>go</span></code>
<span><code>--2.</code><code>在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动</code></span>
<code><span>。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动 </span></code>
<code><span>go </span></code>
<code><span> </span></code>
<code><span> </span></code>
<span><code>--</code><code>然后创建一个作业定时调用上面的同步处理存储过程就行了 </code></span>
<code><span> </span></code>
<code><span>企业管理器 </span></code>
<span><code>--</code><code>管理 </code></span>
<span><code>--SQL Server</code><code>代理 </code></span>
<span><code>--</code><code>右键作业 </code></span>
<span><code>--</code><code>新建作业 </code></span>
<span><code>--"</code><code>常规"项中输入作业名称 </code></span>
<span><code>--"</code><code>步骤"项 </code></span>
<span><code>--</code><code>新建 </code></span>
<span><code>--"</code><code>步骤名"中输入步骤名 </code></span>
<span><code>--"</code><code>类型"中选择"Transact-SQL 脚本(TSQL)" </code></span>
<span><code>--"</code><code>数据库"选择执行命令的数据库 </code></span>
<span><code>--"</code><code>命令"中输入要执行的语句: exec p_process </code></span>
<span><code>--</code><code>确定 </code></span>
<span><code>--"</code><code>调度"项 </code></span>
<span><code>--</code><code>新建调度 </code></span>
<span><code>--"</code><code>名称"中输入调度名称 </code></span>
<span><code>--"</code><code>调度类型"中选择你的作业执行安排 </code></span>
<span><code>--</code><code>如果选择"反复出现" </code></span>
<span><code>--</code><code>点"更改"来设置你的时间安排 </code></span>
<code><span> </span></code>
<code><span> </span></code>
<code><span>然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 </span></code>
<code><span> </span></code>
<code><span>设置方法: </span></code>
<code><span>我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. </span></code>
<code><span> </span></code>
<code><span> </span></code>
<span><code>--3.</code><code>实现同步处理的方法2,定时同步 </code></span>
<code><span> </span></code>
<span><code>--</code><code>在srv1中创建如下的同步处理存储过程 </code></span>
<code><span>create proc p_process </span></code>
<code><span>as </span></code>
<span><code>--</code><code>更新修改过的数据 </code></span>
<code><span>update b set name=i.name,telphone=i.telphone </span></code>
<span><code>from srv2.</code><code>库名.dbo.author b,author i </code></span>
<code><span>where b.id=i.id and</span></code>
<code><span>(b.name <> i.name or b.telphone <> i.telphone) </span></code>
<code><span> </span></code>
<span><code>--</code><code>插入新增的数据 </code></span>
<span><code>insert srv2.</code><code>库名.dbo.author(id,name,telphone) </code></span>
<code><span>select id,name,telphone from author i </span></code>
<code><span>where not exists( </span></code>
<span><code>select * from srv2.</code><code>库名.dbo.author where id=i.id) </code></span>
<code><span> </span></code>
<span><code>--</code><code>删除已经删除的数据(如果需要的话) </code></span>
<code><span>delete b </span></code>
<span><code>from srv2.</code><code>库名.dbo.author b </code></span>
<code><span>where not exists( </span></code>
<code><span>select * from author where id=b.id)</span></code>
<span>go</span>

以上就介绍了经典SQL语句大全,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn