、説明: データベースの作成CREATE DATABASE データベース名 既存のテーブルに基づいて新しいテーブルを作成します: 13、データベースを操作します:
2. 改善
1、説明: テーブルのコピー (構造のみのコピー、ソーステーブル名: 新しいテーブル名: b) (アクセス可能) 3、説明: データベース間でテーブルをコピーします (特定のデータには絶対パスを使用します) (アクセス可能) 4、説明: サブクエリ (テーブル名 1: テーブル名 2: b) 5、説明: 記事、投稿者、最終返信時刻を表示します 6、説明: 外部結合クエリ (テーブル名 1: a テーブル名 2: b) 7、説明: オンラインビュークエリ (テーブル名 1: a ) 8、説明: between の使用法は、クエリ データ範囲を制限し、境界値を含みます。 between は含まれません 9、説明: in 10、説明: 2 つの関連テーブル、セカンダリテーブルにないメインテーブルの情報を削除します 11、説明: 4 つのテーブルの結合クエリの問題: 12、説明: 5 分前にリマインダーをスケジュールします 13、説明: データベースページングを完了する 1 つの sql @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 14、説明: 最初の10レコード 15、説明: 同じ b 値を持つデータの各グループに対応する最大の a を持つレコードの情報をすべて選択します (同様の使用法は、月次フォーラムランキング、月次売れ筋商品分析、ランキングにも使用できます)科目スコアなどによる。) 16. 説明: TableA にはすべての行を含めますが、TableB と TableC には含めず、すべての重複行を削除して結果テーブル (select a from tableA) を除きます (select a from tableB)テーブルC) 、手順: データをランダムに10個取り出しますテーブル名順からnewid()で上位10個を選択 、説明: レコードをランダムに選択しますselect newid() 、説明: 重複レコードを削除します1)、 --自動インクリメント列を追加する 、説明: データベース内のすべてのテーブル名をリストしますselect name from sysobjects where type='U' // U は user を表します 、説明: テーブル内のすべての列名をリストしますid=object_id('TableName') の syscolumns から名前を選択します 、説明: type、vendor、pcs フィールドを type フィールドごとにリストします。select の場合と同様に、Case は複数の選択を簡単に実装できます。 select type,sum(ケースベンダーが「A」の場合、それ以外の場合は0エンド),sum(ケースベンダーの場合は「C」、その後ピースはその他0エンド),sum(ケースベンダーは「B」の場合はそれ以外の場合は0エンド) ) FROM tablename group by type 23. 説明: テーブル table1 を初期化します TRUNCATE TABLE table1 24、説明: 10 から 15 までのレコードを選択します 3. スキル 1、1=1、1=2はSQL文の組み合わせでよく使用されます 「where 1=1」は、すべてを選択するのではなく、「where 1=2」をすべて選択することを意味します。 として直接書くことができます
エラー!カタログエントリが見つかりません。 3、データベースを圧縮 4、既存のユーザー権限を持つ新しいユーザーにデータベースを転送します 5、バックアップセットを確認してください 6、データベースの修復 7、ログクリア セットアップ / 初期化 DBCC SHRINKFILE (@LogicalFileName, @NewSize) 8、説明: テーブルを変更します 9. すべてのテーブルに変更を保存します CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch @Name を NVARCHAR(128) として宣言 curObject CURSOR FOR を宣言します CurObject を開く curObject INTO @Name、@Owner から次をフェッチ curObjectを閉じる ネームスコア 張山80 リシ59 王武50 松泉69 while((tb_tableから分(スコア)を選択)<60) 始まります tb_table設定スコアを更新=スコア*1.01 スコア<60 if (tb_tableからmin(スコア)を選択)>60 休憩 その他 続く 終了
データ開発 - クラシック 2. データベース暗号化: 3.テーブル内のフィールドを取得します: 4.ハードディスクパーティションの表示: 5.テーブル A と B が等しいかどうかを比較します: 6.すべてのプロファイラープロセスを強制終了します: 7.レコード検索: A からの上位 10 件のレコードを選択... はインデックスから検索されますが、後続の A からの上位 30 件のレコードの選択はデータ テーブル内で検索されるため、インデックス内の順序はデータ テーブル内の順序と一致しない可能性があります。結果は、「クエリされたものは元の必要なデータではありません」になります。 1、 A order by ricidから上位30件を選択フィールドが自動増加しない場合、問題が発生します
2, そのサブクエリに条件も追加します: select top 30 recid from A where recid>-1
2
、説明: データベースの削除
3
, 説明: バックアップsqlサーバー---
バックアップデータ作成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: tab_old のようにテーブル tab_new を作成します (古いテーブルを使用して新しいテーブルを作成します)
B: テーブル tab_new を作成しますas selectcol1,col2 ... from tab_old 定義のみ
5、説明: 新しいテーブルを削除します
テーブルのタブ名を削除
6、説明: 列を追加します
タブ名の変更 列の列タイプの追加
注: 列は追加後に削除できません。 DB2 では、列の追加後にデータ型を変更することはできません。変更できるのは、varchar 型の長さを増やすことだけです。
7. 手順: 主キーを追加します : テーブルのタブ名を変更して主キー(列)を追加します
手順: 主キーを削除します: テーブルのタブ名を変更して主キー(列)を削除します
8手順: インデックスの作成:タブ名に [固有の] インデックス idxname を作成します(col….)
インデックスを削除します: インデックス idxname を削除します
注: インデックスを変更することはできません。場合は、削除して再構築する必要があります。
9、手順: ビューの作成: select ステートメントとしてビュー viewname を作成する
view の削除: view viewname を削除
10、手順: いくつかの簡単な基本的なことSQL ステートメント
select: select * from table1 where range
insert: insert into table1(field1,field2) value(value1,value2)
delete:表1からRange
Update : update table1 set field1=value1 where Range
Find: select * from table1 where field1 like '%value1%' ---like の構文は非常に複雑です微妙な情報を確認してください!
Sort:select * from table1 order by field1,field2 [desc]
Total:select count as totalcount from table1
Sum :select sum (field1) を table1 の合計値として選択
average: table1 の avgvalue として avg(field1) を選択
max: table1 の maxvalue として max(field1) を選択
minimum:select min( field1 ) as minvalue from table1
11、説明: いくつかの高度なクエリ演算子
A: 他の 2 つの結果テーブル (TABLE1 と TABLE2 など) を組み合わせた UNION 演算子 UNION 演算子そして、テーブル内の重複行を削除して、結果のテーブルを派生します。 ALL を UNION とともに使用する (つまり、UNION ALL) 場合、重複行は削除されません。どちらの場合も、派生テーブルの各行は TABLE1 または TABLE2 から取得されます
。
B: EXCEPT 演算子
EXCEPT 演算子は、TABLE1 にあるが TABLE2 にはないすべての行を含め、すべての重複行を削除することによって結果テーブルを導出します。 ALL を EXCEPT (EXCEPT ALL) とともに使用すると、重複行は削除されません。
C: INTERSECToperator
INTERSECT演算子は、TABLE1とTABLE2の両方に存在する行のみを含め、重複する行を削除することによって結果テーブルを導出します。 ALL が INTERSECT (INTERSECT ALL) とともに使用される場合、重複行は削除されません。
注: 演算子単語を使用する複数のクエリ結果行は一貫している必要があります。
12、説明: 外部結合を使用します
A、left (outer) join: Left
Outer join (left join): 結果セットには以下が含まれます結合行に一致するテーブル (左結合テーブルのすべての行を含む)。 SQL: LEFT OUT JOIN b ON a.a = b.c
から a.a、a.b、a.c、b.c、b.d、bf を選択します: 右 (外部) 結合:
右外部結合 (右結合) : 結果セットには、結合テーブルの一致する結合行と右結合テーブルのすべての行の両方が含まれます。 C: 完全/クロス (外部) 結合:
完全外部結合: シンボリック接続テーブルの一致する行だけでなく、接続されている 2 つのテーブル内のすべてのレコードも含まれます。
12、グループ化:
グループ化が完了すると、クエリ後にグループ関連の情報のみを取得できます。
グループ関連情報: (統計情報) count、sum、max、min、avg グループ化基準 )
SQLServ でグループ化する場合er: 使用できませんグループ化の基礎としての text、ntext、image タイプのフィールド
selecte 統計関数のフィールドは、通常のフィールドと組み合わせることができません
データベースを接続します : sp_detach_db; データベースを接続します : sp_attach_db 以下は、接続には完全なパス名が必要であることを示します
14 . データベースの名前を変更する方法:sp_renamedb 'old_name', 'new_name'
方法 1: select * into b from a where 1< ;>1 (SQlServer のみ)
方法 2: select top 0 * into b from a
2、説明: テーブルのコピー (データのコピー、ソース テーブル名: ターゲット テーブル)名前: b) (アクセス可能)
b(a, b, c) に挿入 b(a, b, c) select d,e,f from b;
b(a, b, c) に挿入します b から d,e,f を選択します'特定のデータベース' where 条件 例: ..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..
select a, b, c from a where a IN (select d from b ) または: select a , b,c から 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
a.a、a.b、a.c、b.c、b.d、bf を LEFT OUT JOIN b ON a.a から選択します。 = 紀元前
select * from (SELECT a,b,c FROM a) T where t.a > 1;;
select * from table1 where time1 と time2 の間の時間select a,b, c、table1から、aは値1と値2の間にありません
select * from table1 where a [not] in ('value1','value2','value4','value6') の使用方法
存在しない table1 から削除 ( select * from table2 where table1.field1=table2 .フィールド1)
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 Schedule where datediff(' minutes',f start time,getdate())>5
上位 10 の b.* を選択 (上位 20 を選択 主キーフィールド,)並べ替えフィールド からテーブル名 order by sort field desc) a,テーブル名 b where b.主キーフィールド = a.主キーフィールド order by a.sortフィールド
具体的な実装:
概要データベースのページング:
注: top の後に直接変数を続けることはできないため、実際のアプリケーションではこれが特別な処理を実行する唯一の方法です。 Ridは、topの後に特定のフィールドがある場合、これは非常に有益です。これにより、topのフィールドが論理的にインデックス付けされている場合(論理インデックス内のデータがデータテーブル内のデータと一致しない可能性があり、クエリがインデックス内にある場合)、クエリ結果後の実際のテーブルの不整合を回避できるためです。次に、最初にインデックスをクエリします)
上位10を選択* form table1 where range
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
から
17
18
19
IDが含まれていないテーブル名から削除します(テーブル名グループからcol1、col2、...でmax(id)を選択します2) ,select unique * into temp from tablename
delete from tablename
insert into tablename
select * from temp 評価: この操作には大量のデータの移動が含まれます。大容量だがデータ操作には向いていない
3)、例:外部テーブルにデータをインポートする際、初回は何らかの理由で一部のみインポートされるが、具体的な場所の判断が難しい, そのため、次回はこのように完全にインポートすることしかできません。これにより、重複フィールドが大量に削除されます
。
テーブルを変更する
add column_bintidentity(1,1)
delete from tablenamewhere column_b not in(select max(column_b) from tablename を列 1、列 2、... でグループ化
)テーブル tablename を変更して列を削除 column_b
20
21
22
表示結果:
type Vendor pcs
computer
A 1computerA 1CD
B 2CD
A 2 携帯電話
B 3携帯電話C 3
select top 5 * from (select top 15 * from table order by id asc) table_alias order by id desc
例:
if @strWhere !=''
begin
set @strSQL = 'select count( *) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
終わり
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定化 '+ @strWhere 2、データベースを縮小します
-- インデックスの再構築
DBCC REINDEX
DBCC INDEXDEFRAG
--データとログの圧縮
DBCC SHRINKDB
DBCC SHRINKFILE
dbcc shrindatabase(dbname)
exec sp_change_users_login 'update_one','newname','oldname'
go
disk='E:dvbbs.bak'から確認的に復元してください
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] ULTI _ユーザー
ゴー
NOCOUNT ONを設定
DECLARE @LogicalFileName sysname、
@MaxMinutes INT、
@NewSize INT
USE tablename -- 操作するデータベースの名前
SELECT @LogicalFileName = 'tablename_log', -- ログファイル名
@MaxMinutes = 10, -- 許可される時間の制限ログをラップします
@NewSize = 1 -- 設定したいログファイルのサイズ (M)
DECLARE @OriginalSize int
SELECT @OriginalSize = サイズ
FROM sysfiles
WHERE name = @LogicalFileName
SELECT '元のサイズ ' + db_name() + ' LOG は ' +
CONVERT(VARCHAR(30), @OriginalSize) + ' 8K ページ または ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) ) null ではありません)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
EXEC (@TruncLog)
-- 必要に応じてログをラップします。
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- 時間は切れていません
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- 外側のループ。
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 ' + db_name() + ' LOG の最終サイズは ' +
CONVERT(VARCHAR(30),size) + ' 8K ページまたは ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
exec sp_changeobjectowner 'tablename','dbo'
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
@Owner を NVARCHAR(128) として宣言
@OwnerName を NVARCHAR(128) として宣言
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
名前で並べ替えます
curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@ Name)
exec sp_changeobjectowner @OwnerName、@NewOwner
end
-- @name、@NewOwner、@OldOwner を選択します
END
curObjectの割り当てを解除する
GO
10、直接ループして SQL SERVER にデータを書き込みます
declare @i int
set @i=1
while @i<30
begin
テスト (ユーザー ID) 値 (@) に挿入i)
set @i=@i+1
end
ケース :
は、0.1 の増加に基づいて、すべての不合格グレードに合格する必要があります。毎回、彼らがただ通過するように:
1. 姓の画数で並べ替えます:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //最小から最大まで
select encrypt('元のパスワード')
select pwdencrypt('元のパスワード')
select pwdcompare('元のパスワード','暗号化されたパスワード' ) = 1 -- それ以外は同じ; encrypt('元のパスワード')
select pwdencrypt('元のパスワード')
select pwdcompare('元のパスワード','暗号化されたパスワード') = 1 -- それ以外は同じ。同じではありません
declare @list varchar(1000),
@sql nvarchar(1000)
select @list=@list+','+b.name from sysobjects a,syscolumns b ここで、a.id=b.id および a.name='TableA'
set @sql='select '+right(@list,len(@list)-1) + ' テーブル A から'
exec (@sql)
EXEC master..xp_fixeddrives
if (A から checksum_agg(binary_checksum(*)) を選択)
=
(B から checksum_agg(binary_checksum(*)) を選択)
print '等しい'
else
print '等しくない'
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE Program_name IN('SQL profiler ',N' SQL Profiler')
EXEC sp_msforeach_worker '?'
Nで始まるレコードテーブルから上位Nを選択
------ - -----------------------
N
からMレコード(はメインインデックスを必要とします) ID)Select Top M-N * From Table Where ID in (Select Top M ID From
Table) ID 説明で注文------------------ -------- -------------------N
最後まで記録上位Nを選択 * 表から
ID 説明による順序 の場合
例 1: テーブルに 10,000 を超えるレコードがある場合、テーブル RecID の最初のフィールドは、
を見つけるための自己増加フィールドです。 31から40の記録。
Recid が含まれていない A から上位 10 位の REID を選択します (A から上位 30 位の REID を選択します)
分析: このように書くと、テーブル内に recid の論理インデックスがある場合にいくつかの問題が発生します。
: テーブルの最後のレコードをクエリします。このテーブルにどれだけのデータ、があるかわかりません。 set @s = 'pid が入っていない T から上位 1 * を選択 (select top ' + str(@count-1) + ' pid from T)'
print @s exec sp_executesql @s
9: 現在のデータベース内のすべてのユーザー テーブルを取得します
xtype='u' および status>=0 の sysobjects から名前を選択します
10
: テーブルのすべてのフィールドを取得しますid=object_id('テーブル名')のsyscolumnsから名前を選択します
id が含まれる syscolumns から名前を選択します (type = 'u' および name = 'table name' である sysobjects から ID を選択します)
どちらの方法でも効果は同じです
11: テーブルに関連するビュー、ストアド プロシージャ、関数を表示します
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '% table Name %'
12
: 現在のデータベース内のすべてのストアド プロシージャを表示します xtype='P' の sysobjects からストアド プロシージャ名として名前を選択します
13: ユーザーによって作成されたすべてのデータベースをクエリします
select * from master..sysdatabases D where sid not in (select sid from master..syslogins where name='sa')
または
dbid を選択し、master..sysdatabases から DB_NAME という名前を付けます。ここで、sid <> は 0x01
14
: 特定のテーブルのフィールドとデータ型をクエリしますinformation_schema.columnsからcolumn_name,data_typeを選択しますwhere table_name = 'テーブル名'
15
: 異なるサーバーデータベース間のデータ操作 ---
リンクサーバーを作成します exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', 'リモート サーバー名または IP アドレス '
exec sp_addlinkedsrvlogin 'ITSV '、'false '、null、'ユーザー名 '、'パスワード '
--クエリの例
ITSV.データベース名.dbo.テーブル名から*を選択
--インポート例
ITSV.データベース名.dbo.テーブル名からテーブルに * を選択
--
リンクされたサーバーが使用されなくなったら削除します exec sp_dropserver 'ITSV '、'droplogins '
--リモート/LANデータに接続(openrowset/openquery/opendatasource)
--1.openrowset
--クエリの例
select * from openrowset( 'SQLOLEDB ', 'SQLサーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名)
-- ローカルテーブルを生成します
select * into table from openrowset( 'SQLOLEDB ', 'SQL サーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名)
--ローカルテーブルをリモートテーブルにインポートします
insert openrowset( 'SQLOLEDB ', 'SQL サーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名)
*ローカルテーブルから選択
--ローカルテーブルを更新します
アップデート
b.列A=a.列Aを設定します
openrowset( 'SQLOLEDB ', 'SQL サーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名) を内部結合ローカルテーブルとして b
a.column1=b.column1 について
--openquery を使用するには接続を作成する必要があります
-- まず、リンク サーバーを作成するための接続を作成します
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', 'リモート サーバー名または IP アドレス '
-- クエリ
*を選択してください
FROM openquery(ITSV, 'SELECT * FROM データベース.dbo.テーブル名')
--ローカルテーブルをリモートテーブルにインポートします
insert openquery(ITSV, 'SELECT * FROM database.dbo.table name ')
ローカルテーブルから*を選択
--ローカルテーブルを更新します
アップデート
b.B列=a.B列を設定します
FROM openquery(ITSV, 'SELECT * FROM database.dbo.tablename ') として
a.列A=b.列Aのローカルテーブルbの内部結合
--3.opendatasource/openrowset
セレクト*
FROM opendatasource( 'SQLOLEDB ', 'データソース=ip/サーバー名;ユーザーID=ログイン名;パスワード=パスワード' ).test.dbo.roy_ta
--ローカルテーブルをリモートテーブルにインポートします
insert opendatasource( 'SQLOLEDB ', 'データソース=ip/サーバー名;ユーザーID=ログイン名;パスワード=パスワード').Database.dbo.テーブル名
ローカルテーブルから*を選択
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 がempty, return replace_ value の値、空ではない、check_expression 文字操作クラスを返すだけです
5,Sp_addtype カスタムデータタイプ例: EXEC sp_addtype birthday, datetime, 'NULL'
<code><strong><span>6,set nocount {on|off}</span></strong></code>
<span>使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。</span>
<span>SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。</span><br />
<span>SET NOCOUNT </span><span>为 OFF 时,返回计数</span>
<code><strong><span>常识</span></strong></code><code></code>
<code><strong><span> </span></strong></code>
<span><code><strong>在SQL查询中:</strong></code><code><strong>from</strong></code><code>后最多可以跟多少张表或视图:</code><code><strong>256</strong></code><code></code></span>
<span><code><strong>在</strong></code><code><strong>SQL</strong></code><code><strong>语句中出现 </strong></code><code><strong>Order by</strong></code><code><strong>,</strong></code><code><strong>查询时,</strong></code><code><strong>先排序,后取</strong></code></span>
<span><code><strong>在</strong></code><code><strong>SQL</strong></code><code><strong>中,一个字段的最大容量是</strong></code><code><strong>8000</strong></code><code><strong>,而对于</strong></code><code><strong>nvarchar(4000)</strong></code><code><strong>,</strong></code><code><strong>由于</strong></code><code><strong>nvarchar</strong></code><code><strong>是Unicode码。 </strong></code></span>
<code><strong><span> </span></strong></code>
<code><strong><span>SQLServer2000</span></strong></code><span><code><strong>同步复制技术实现步骤</strong></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>