ホームページ  >  記事  >  バックエンド開発  >  古典的な SQL ステートメントの完全なコレクション

古典的な SQL ステートメントの完全なコレクション

WBOY
WBOYオリジナル
2016-08-08 09:28:581165ブラウズ

1.基本

1、説明: データベースの作成
CREATE DATABASE データベース名
2、説明: データベースの削除
データベース dbname の削除
3、説明: バックアップ SQLサーバー
--- デバイスを作成しますマスターを使用しますEXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
--- バックアップを開始します

データベースpubをtestBackにバックアップします

4
、手順: 新しいテーブルを作成しますcreate table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

既存のテーブルに基づいて新しいテーブルを作成します:
A: tab_old のようにテーブル tab_new を作成します (古いテーブルを使用して新しいテーブルを作成します)
B: select Col1,col2… from としてテーブル tab_new を作成します。 tab_old定義のみ5
、説明:削除新しいテーブルテーブルTabname
6、説明:列
AlterテーブルTabNameの追加列colタイプnote
:
列を追加した後は削除できません。 DB2 では、列の追加後にデータ型を変更することはできません。変更できるのは、varchar 型の長さを増やすことだけです。 7. 手順: 主キーを追加します: テーブルのタブ名を変更して主キーを追加します(列)
手順: 主キーを削除します: テーブルのタブ名を変更して主キーを削除します(列)
8. 手順: インデックスを作成します:
タブ名(col….)に[一意の]インデックスidxnameを作成します。
インデックスを削除します: インデックスidxnameを削除します
注: インデックスを変更したい場合は、削除して再構築する必要があります。
9
、説明: ビューの作成: select ステートメントとしてビュー viewname を作成します
ビューの削除: view viewname を削除します10
、説明: いくつかの単純な基本 SQL ステートメント
Select: select * from table1 where
rangeinsert: insert into table1(field1,field2) names(value1,value2)delete: delete from table1 where range
update
: update table1 set field1 = value1 where

rangeSearch: select * from table1 where field1 like '%value1%' ---like構文がとても絶妙なので、情報を確認してください
!Sort: select * from table1 order by field1,field2 [desc]
Total:
table1 の totalcount として count を選択 Sum:
table1 の合計値として sum(field1) を選択
Average:
table1 の avgvalue として avg(field1) を選択
Max:
table1 の maxvalue として max(field1) を選択
minimum:
table1 の minvalue として min(field1) を選択

11
、説明: いくつかの高度なクエリ操作の単語
A:
UNION 演算子 UNION 演算子は、他の 2 つの結果テーブル (TABLE1 と TABLE2 など) を結合し、テーブル内の重複行を削除することによって結果テーブルを導出します。 ALL を UNION とともに使用する (つまり、UNION ALL) 場合、重複行は削除されません。どちらの場合も、派生テーブルの各行は TABLE1 または TABLE2 から取得されます
B: EXCEPT 演算子
EXCEPT 演算子は、TABLE1 にあるが TABLE2 にはないすべての行を含め、すべての重複行を削除することによって結果テーブルを導出します。 ALL を EXCEPT (EXCEPT ALL) とともに使用すると、重複行は削除されません。
C: INTERSECT operator
INTERSECT 演算子は、TABLE1 と TABLE2 の両方に存在する行のみを含め、重複する行を削除することによって結果テーブルを導出します。 ALL
が INTERSECT (INTERSECT ALL) とともに使用される場合、重複行は削除されません。 注: 演算子単語を使用する複数のクエリ結果行は、一貫性がなければなりません
12、説明: 外部結合を使用します
A、左 (外部) 結合:
left
外部結合 (左結合): 結果セットには、結合されたテーブルの一致する行が含まれます。また、Left はテーブルのすべての行を結合します。
SQL: LEFT OUT JOIN b ON a.a = b.c から a.a、a.b、a.c、b.c、b.d、bf を選択します
B: 右 (外部) 結合:

右外部結合 (右結合): 結果このセットには、結合テーブルの一致する結合行と、右側の結合テーブルのすべての行の両方が含まれます。

C: 完全/クロス (外部) 結合:
完全外部結合: シンボリック接続テーブルの一致する行だけでなく、接続されている 2 つのテーブル内のすべてのレコードも含まれます。
12
、グループ化
:Group by: テーブル、グループ化が完了すると、クエリ後にグループ関連の情報のみを取得できます。
グループ関連情報:
(統計情報) count、sum、max、min、avg グループ化の基準 ) SQL Server でグループ化する場合: text、ntext、image タイプのフィールドはグループ化の基準として使用できません
selecte 統計関数のフィールドを通常のフィールドと一緒に配置することはできません

13、データベースを操作します:
データベースを接続します: sp_detach_db; データベースを接続します : sp_attach_db の後には、添付ファイルに完全なパス名が必要であることを示します
14.データベース名を変更します:
sp_renamedb 'old_name', 'new_name'

2. 改善

1、説明: テーブルのコピー (構造のみのコピー、ソーステーブル名: a 新しいテーブル名: b) (アクセス可能)
方法 1: select * into b from a where 1<> ;1 (SQlServer のみ)
方法 2: select top 0 * into b from a
2、説明: copy table (データをコピー、ソーステーブル名: a ターゲットテーブル名: b) (アクセス可能)
b(a, b, c)に挿入 bからd,e,fを選択;

3、説明: データベース間でテーブルをコピーします (特定のデータには絶対パスを使用します) (アクセス可能)
b(a, b, c) に挿入します ' の b から d,e,f を選択します特定のデータベース' where 条件
例: ..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..

4、説明: サブクエリ (テーブル名 1: テーブル名 2: b)
select a,b,c from a where a IN (select d from b) または: select a,b , c from a ここで a IN (1,2,3)

5、説明: 記事、投稿者、最終返信時刻を表示します
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title= a.タイトル)b

6、説明: 外部結合クエリ (テーブル名 1: テーブル名 2: b)
LEFT OUT JOIN b ON a.a = b.c から a.a、a.b、a.c、b.c、b.d、b.f を選択します

7、説明: オンラインビュークエリ (テーブル名 1: a )
select * from (SELECT a,b,c FROM a) T where t.a >

8

、説明: between の使用法はクエリデータ範囲を制限し、境界値を含みます。not between には含まれませんselect * from table1 where time1 と time2 の間の時間
select a,b,c, from table1 ここで、 a は値 1 と値 2 の間にありません

9

、説明: select * from table1 where a [not] in ('value
1','value2','value4','value6') での使用方法

10

、説明: 2 つの関連テーブル、セカンダリ テーブルにないメイン テーブルの情報を削除します
存在しないテーブル 1 から削除 ( select * from table2 where table1.field1=table2.field1) )

11

、説明: 4 つのテーブルの結合クエリの問題: 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....

12

、説明: 5 分前にリマインダーをスケジュールします
SQL: select * from Schedule where datediff(' minutes',f start time,getdate())>5

13

、説明: データベースのページングを完了する 1 つの sql

ステートメント 上位 10 の b.* を選択 (上位 20 を選択
主キー フィールド,並べ替えフィールド から テーブル名並べ替え 並べ替えフィールド) desc) a,テーブル名 b where b.主キーフィールド = a.主キーフィールド a.で並べる.ソートフィールド具体的な実装:データベースページングについて:

@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 は識別列です。先頭の後に特定のフィールドがある場合、これは非常に有益です。これにより、最上位フィールドが論理インデックスの場合、クエリ結果後の実際のテーブルの不整合を回避できるため (論理インデックス内のデータはデータ テーブルと不一致になる可能性があり、クエリ中にインデックス内にある場合は、インデックスが最初にクエリされます)

14、説明: 上位 10 レコード
上位 10 を選択 * フォーム table1 where range

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 tableB) ただし (select a from tableA)テーブルC)

17

、手順: データをランダムに10個取り出しますテーブル名順からnewid()で上位10個を選択

18

、説明: レコードをランダムに選択しますselect newid()

19

、説明: 重複レコードを削除します1)、
IDが含まれていないテーブル名から削除します(テーブル名グループからcol1、col2、...でmax(id)を選択します2)、個別に選択します* into temp from tablename
delete from
tablename insert into
tablename select * from temp
評価: この操作には大量のデータの移動が含まれます。このアプローチは次の用途には適していません。ボリュームは大きいですが、データ操作
3)、例: データを外部テーブルにインポートする場合、何らかの理由で初回はその一部のみがインポートされますが、特定の場所を特定するのは難しいため、全体のみがインポートされます次回インポートされると重複フィールドが大量に作成されます。重複フィールドを削除する方法

テーブルを変更する

tablename--
自動インクリメント列を追加する
add column_b
intidentity(1,1)delete from tablename
where column_b not in(
select max(column_b) from tablename を列 1、列 2、... でグループ化
)
テーブル tablename を変更して列 column_b を削除

20

、説明: データベース内のすべてのテーブル名をリストしますselect name from sysobjects where type='U' // U は user を表します

21

、説明: テーブル内のすべての列名をリストしますid=object_id('TableName') の syscolumns から名前を選択します

22

説明: type フィールドごとに並べられた type、vendor、pcs フィールドをリストします。select の場合と同様に、複数の選択を簡単に実装できます。 タイプを選択,sum(ケースベンダーが「A」の場合、それ以外の場合は0エンド),sum(ケースベンダーが「C」の場合、ケースベンダーがそれ以外の0エンド),sum(ケースベンダーが「B」の場合、それ以外の場合は0エンド) FROM タイプ別テーブル名グループ

表示結果:
タイプ ベンダー pcs

Computer
A 1Computer
A 1
CD
B 2
CD
A 2
携帯電話
B3
携帯電話C3

23. 説明: テーブル table1 を初期化します

TRUNCATE TABLE table1

24

、説明: 10 から 15 までのレコードを選択します上位 5 を選択 * から (上位 15 を選択 * テーブルから ID asc 順に並べます) table_alias ID 順に並べ替えます
3. スキル

1、1=1、1=2はSQL文の組み合わせでよく使用されます

「where 1=1」は、すべてを選択するのではなく、「where 1=2」をすべて選択することを意味します。例:

if @strWhere !=''
beginset @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 2
、データベースを縮小します --再構築インデックス
DBCC REINDEXDBCC INDEXDEFRAG--
データとログの圧縮

DBCC SHRINKDB
DBCC SHRINKFILE
3
、データベースを圧縮します

dbcc sinnerdatabase(dbname)
4、既存のユーザー権限を持つ新しいユーザーにデータベースを転送します

exec sp_change_users_login 'update_one','newname','oldname'go
5
、バックアップセットを確認してください

disk='E:dvbbs.bak'から検証のみ復元してください

6、データベースを修復します
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
ゴー

7、ログクリア
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'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
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

8、説明: テーブルを変更します
exec sp_changeobjectowner 'tablename','dbo'

9. すべてのテーブルに変更を保存します

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

@Name を NVARCHAR(128) として宣言
@Owner を NVARCHAR(128) として宣言
@OwnerName を NVARCHAR(128) として宣言

curObject CURSOR FOR を宣言します
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
名前で並べ替えます

CurObject を開く
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 を選択します

curObject INTO @Name、@Owner から次をフェッチ
END

curObjectを閉じる
curObjectの割り当てを解除する
GO


10、SQL SERVER ループにデータを直接書き込みます
declare @i int
set @i=1
while @i<30
begin
テスト (ユーザー ID) 値 (@i) に挿入します
set @i=@i+1
end
ケース
:
には次の表があります。すべての不合格成績を加算し、毎回 0.1 ずつ増加するようにする必要があります。 :

ネームスコア

張山80

リシ59

王武50

松泉69

while((select min(score) from tb_table)<60)

始まります

tb_table セットスコア =score*1.01 を更新します

スコア<60

if (tb_tableからmin(スコア)を選択)>60

休憩

その他

続く

終了

データ開発 - クラシック


1. 姓の画数で並べ替えます:
Select * From TableName Order By CustomerName Collat​​e 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='
TableA'
set @sql='select '+right(@list,len(@list)-1)+'テーブル A から'
exec (@sql)

4.ハードディスクパーティションを表示:
EXEC master..xp_fixeddrives

5.テーブル A と B が等しいかどうかを比較します:
if (A から checksum_agg(binary_checksum(*)) を選択)
=
(B から checksum_agg(binary_checksum(*)) を選択)
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レコード
上位Nを選択 * テーブルから
---------- ----- -----------
N
からMレコード(プライマリインデックスIDが必要)
上位M-Nを選択 * テーブルWhere IDから(上位を選択M ID テーブルから) ID 説明による順序
-------------------------------------------------
Nレコード最後まで
Select Top N * From TableID Desc
Case で並べ替え
例 1: テーブルに 10,000 件を超えるレコードがあります。テーブルの最初のフィールド RecID は、自己増加フィールドです。レコード 31 から 40 を調べる SQL ステートメントを記述します。

レコードが含まれていない A から上位 10 のレコードを選択します (A から上位 30 のレコードを選択します)

分析: このように書くと、テーブル内に recid の論理インデックスがある場合にいくつかの問題が発生します。

A からの上位 10 件のレコードを選択... はインデックスから検索されますが、後続の A からの上位 30 件のレコードの選択はデータ テーブル内で検索されるため、インデックス内の順序はデータ テーブル内の順序と一致しない可能性があります。結果は、「クエリされたものは元の必要なデータではありません」になります。

解決策

1. A order by ricid から上位 30 件の ID を選択して注文を使用します。フィールドが自動的に成長しない場合、問題が発生します。

2、 そのサブクエリに条件も追加します: select Top 30 recid from A where recid>-1

例 2

: テーブルの最後のレコードをクエリします。このテーブルにどれだけのデータ

が存在するか、およびテーブル構造がわかりません。 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: テーブルに関連するビュー、ストアド プロシージャ、関数を表示します
sysobjects a、syscomments b から a.* を選択します (a.id = b.id および 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')
または
select dbid、name AS DB_NAME from master..sysdatabases where sid <>

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為空,則返回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 までご連絡ください。