Home >Backend Development >PHP Tutorial >Complete collection of classic SQL statements
1. Basics
1, Description: Create database
CREATE DATABASE database-name
2, Description: Delete database
drop database dbname
3, Description: Backup sql server
--- Create device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
--- Start backup
BACKUP DATABASE pubs TO testBack
4、Instructions: Create a new table
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
Create a new table based on an existing table:
A: create table tab_new like tab_old (use the old table to create a new table)
B: create table tab_new as select col1,col2… from tab_old definition only
5, Description: Delete new table
drop table tabname
6, Description: Add a column
Alter table tabname add column col type
Note: After adding a column, it cannot be deleted. In DB2, the data type cannot be changed after the column is added. The only thing that can be changed is to increase the length of the varchar type.
7. Instructions: Add primary key: Alter table tabname add primary key(col)
Instructions: Delete primary key: Alter table tabname drop primary key(col)
8. Instructions: Create index: create [unique] index idxname on tabname(col….)
Delete index: drop index idxname
Note: The index cannot be changed. If you want to change it, you must delete it and rebuild it.
9, Description: Create a view: create view viewname as select statement
Delete view: drop view viewname
10, Description: A few simple basic sql statements
Select: select * from table1 where range
insert: insert into table1(field1,field2) values(value1,value2)
delete: delete from table1 where range
update: update table1 set field1= value1 where range
Search: select * from table1 where field1 like '%value1%' ---likeThe syntax is very exquisite, check the information!
Sort: select * from table1 order by field1,field2 [desc]
Total: select count as totalcount from table1
Sum: select sum(field1) as sumvalue from table1
Average: select avg(field1) as avgvalue from table1
Max: select max(field1) as maxvalue from table1
minimum: select min(field1) as minvalue from table1
11, description: several advanced query operation words
A: UNION Operators The
UNION operator derives a result table by combining two other result tables (such as TABLE1 and TABLE2) and eliminating any duplicate rows in the tables. When ALL is used with UNION (that is, UNION ALL), duplicate rows are not eliminated. In both cases, each row of the derived table comes from either TABLE1 or TABLE2.
B: EXCEPT operator
EXCEPT operator derives a result table by including all rows that are in TABLE1 but not in TABLE2 and eliminating all duplicate rows. When ALL is used with EXCEPT (EXCEPT ALL), duplicate rows are not eliminated.
C: INTERSECT operator
INTERSECT operator derives a result table by including only rows that are present in both TABLE1 and TABLE2 and eliminating any duplicate rows. When ALL is used with INTERSECT (INTERSECT ALL), duplicate rows are not eliminated.
Note: Several query result lines using operator words must be consistent .
12, description: Use outer join
A, left (outer) join:
leftOuter join (left join): The result set includes matching rows of the joined table, as well as Left joins all rows of the table.
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B: right (outer) join:
right outer join (right join): result The set includes both matching join rows from the join table and all rows from the right join table.
C: full/cross (outer) join:
Full outer join: not only includes matching rows of the symbolic connection table, but also includes all records in the two connected tables.
12, grouping:Group by:
A table, once the grouping is completed, only group-related information can be obtained after querying.
Group related information: (statistical information) count, sum, max, min, avg Criteria for grouping )
When grouping in SQL Server: Fields of text, ntext, and image types cannot be used as the grouping basis
The fields in the selecte statistical function cannot be placed together with ordinary fields;
13, operate the database:
Detach the database: sp_detach_db; Attach the database : sp_attach_db followed by indicates that attachment requires a complete path name
14. How to modify the database Name:
sp_renamedb 'old_name', 'new_name'
2. Improvement
1, Description: Copy table (only copy structure, source table name: a New table name: b) (Access available)
Method 1: select * into b from a where 1<> ;1 (only for SQlServer)
Method 2: select top 0 * into b from a
2, description: copy table (copy data, source table name: a target table name: b) (Access available)
insert into b(a, b, c) select d,e,f from b;
3, Description: Copy tables between databases (use absolute paths for specific data) (Access available)
insert into b(a, b, c) select d,e,f from b in 'Specific database' where condition
Example: ..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..
4, description: subquery (table name 1: a table name 2: b)
select a,b,c from a where a IN (select d from b) or: select a,b ,c from a where a IN (1,2,3)
5, Description: Display the article, submitter and last reply time
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title= a.title) b
6, description: outer join query (table name 1: a table name 2: b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7, Description: Online view query (table name 1: a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8, description: usage of between, between limits the query data range and includes boundary values, not between does not include
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between value 1 and value 2
9、Instructions: How to use in
select * from table1 where a [not] in ('value1','value2','value4','value6')
10, Description: Two related tables, delete the information in the main table that is not in the secondary table
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、Explanation: Four table joint query problem:
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, Description: Schedule reminder five minutes in advance
SQL: select * from Schedule where datediff('minute',f start time,getdate())>5
Specific implementation:
About database paging:
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
Note: top cannot be directly followed by a variable, so in practical applications this is the only way to perform special processing. Rid is an identification column. If there are specific fields after top, this is very beneficial. Because this can avoid the inconsistency in the actual table after the query result if the top field is a logical index (the data in the logical index may be inconsistent with the data table, and if it is in the index during the query, the index will be queried first)
14, description: top 10 records
select top 10 * form table1 where range
15, description: Select all the information of the record with the largest a corresponding to each group of data with the same b value (similar usage can be used for monthly forum rankings, monthly hot-selling product analysis, press Subject score ranking, etc..)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16. Description: Include all rows in TableA but not in TableB and TableC and eliminate all duplicate rows to derive a result table
(select a from tableA) except (select a from tableB) except ( select a from tableC)
17、Instructions: Randomly take out 10 pieces of data
select top 10 * from tablename order by newid()
18, Description: Randomly select records
select newid()
19、Explanation: Delete duplicate records
1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
2),select distinct * into temp from tablename
delete from tablename
insert into tablename select * from temp
Evaluation: This operation involves the movement of a large amount of data. This approach is not suitable for large volumes but Data operation
3), for example: importing data into an external table, for some reasons only a part of it is imported the first time, but it is difficult to judge the specific location, so only the whole thing is imported next time, which creates a lot of duplication fields, how to delete duplicate fields
alter table tablename
--Add an auto-increment column
add column_bint identity(1,1)
delete from tablenamewhere column_b not in(
select max(column_b) from tablename group by column1,column2,...)
alter table tablename drop column column_b
20, Description: List all table names in the database
select name from sysobjects where type='U' // U represents user
21, Description: List all column names in the table
select name from syscolumns where id=object_id('TableName')
22. Description: List the type, vendor, and pcs fields, arranged by the type field. Case can easily implement multiple selections, similar to the case in select.
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
Display results:
type vender pcs
ComputerA 1
ComputerA 1
CDB 2
CDA 2
Mobile phone B 3
Mobile phone C 3
23. Description: Initialize table table1
TRUNCATE TABLE table1
24, Description: Select records from 10 to 15
select top 5 * from (select top 15 * from table order by id asc) table_alias order by id desc
3. Skills
1, 1=1, 1=2 are often used in SQL statement combinations
"where 1=1" means to select all "where 1=2" and not select all,
such as:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
We can write it directly as
Error! Catalog entry not found.
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 stabilize '+ @strWhere 2, shrink the database
--Rebuild the index
DBCC REINDEX
DBCC INDEXDEFRAG
--Shrink data and logs
DBCC SHRINKDB
DBCC SHRINKFILE
3, compress database
dbcc shrinkdatabase(dbname)
4, transfer the database to the new user with existing user rights
exec sp_change_users_login 'update_one','newname','oldname'
go
5、Check the backup set
RESTORE VERIFYONLY from disk='E:dvbbs.bak'
6, repair database
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、Log clear
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- The name of the database to be operated
SELECT @LogicalFileName = 'tablename_log', -- Log file name
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- The size of the log file you want to set (M)
Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30), @OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000 ) not 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)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
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 'Final 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, Description: Change a table
exec sp_changeobjectowner 'tablename','dbo'
9. Store changes to all tables
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
where user_name(uid)=@OldOwner
order by name
OPEN CurObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + 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, write data directly in SQL SERVER loop
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
Case :
has the following table. It is required to correct all the failing grades and make them just pass on the basis of an increase of 0.1 each time:
Name Score
Zhangshan 80
Lishi 59
Wangwu 50
Songquan 69
while((select min(score) from tb_table)<60)
begin
update tb_table set score =score*1.01
where score<60
if (select min(score) from tb_table)>60
break
else
Continue
end
Data Development-Classic
1. Sort by strokes of last name:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //From least to most
2. Database encryption:
select encrypt('original password')
select pwdencrypt('original password')
select pwdcompare('original password','encrypted password') = 1 --Same; otherwise not the same encrypt('original password')
select pwdencrypt('original password')
select pwdcompare('original password','encrypted password') = 1--same; otherwise not Same
3.Retrieve the fields in the table:
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)+' from Table A'
exec (@sql)
4.View hard disk partition:
EXEC master..xp_fixeddrives
5.Compare tables A and B for equality:
if (select checksum_agg(binary_checksum(*)) from A)
=
(select checksum_agg(binary_checksum(*)) from B)
print ' Equal'
else
print 'Not equal'
6.Kill all profiler processes:
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 '?'
starting to
N
Select Top M-N * From table
----------------------------------
NRecord to the end
Case
For example 1: There are more than 10,000 records in a table. The first field of the table, RecID, is a self-increasing field. Write a SQL statement to find out the value of the table. Records 31 to 40.
select top 10 recid from A where recid not in(select top 30 recid from A)
Analysis: If written like this, some problems will occur if recid has a logical index in the table.
Select top 10 recid from A where... is searched from the index, while the subsequent select top 30 recid from A is searched in the data table, so the order in the index may be inconsistent with that in the data table, which results in What is queried is not the original desired data.
Solution
1. Use order by select top 30 recid from A order by ricid. If the field does not grow automatically, problems will arise
Example
9: Get all user tables in the current database
select Name from sysobjects where xtype='u' and status>=0
10: Get all fields of a table
select name from syscolumns where id=object_id('table name')
select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = 'table name')
Both methods have the same effect
11: View views, stored procedures, and functions related to a table
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%table name%'
12: View all stored procedures in the current database
select name as stored procedure name from sysobjects where xtype='P'
13: Query all databases created by the user
select * from master..sysdatabases D where sid not in (select sid from master..syslogins where name='sa')
or
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
14: Query the fields and data types of a certain table
select column_name,data_type from information_schema.columns
where table_name = 'table name'
15: Data operations between different server databases
--Create a linked server
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', 'Remote server name or ip address '
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, 'username ', 'password '
--Query example
select * from ITSV.database name.dbo.table name
--Import example
select * into table from ITSV.database name.dbo.table name
--Delete linked servers when no longer in use
exec sp_dropserver 'ITSV ', 'droplogins '
--Connect remote/LAN data (openrowset/openquery/opendatasource)
--1. openrowset
--Query example
select * from openrowset( 'SQLOLEDB ', 'sql server name '; 'user name '; 'password ', database name.dbo.table name)
--Generate local table
select * into table from openrowset( 'SQLOLEDB ', 'sql server name '; 'user name '; 'password ', database name.dbo.table name)
--Import local table to remote table
insert openrowset( 'SQLOLEDB ', 'sql server name '; 'user name '; 'password ', database name.dbo.table name)
select *from local table
--Update local table
update b
set b.Column A=a.Column A
from openrowset( 'SQLOLEDB ', 'sql server name '; 'user name '; 'password ', database name.dbo.table name) as a inner join local table b
on a.column1=b.column1
--openquery usage requires creating a connection
--First create a connection to create a linked server
exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', 'Remote server name or ip address '
--Query
select *
FROM openquery(ITSV, 'SELECT * FROM database.dbo.table name ')
--Import local table to remote table
insert openquery(ITSV, 'SELECT * FROM database.dbo.table name ')
select * from local table
--Update local table
update b
set b.Column B=a.Column B
FROM openquery(ITSV, 'SELECT * FROM database.dbo.tablename ') as a
inner join local table b on a.Column A=b.Column A
--3. opendatasource/openrowset
SELECT *
FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=login name;Password=password ' ).test.dbo.roy_ta
--Import local table to remote table
insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=Login name;Password=Password ').Database.dbo.Table name
select * from local table
SQL Server Basic Functions
SQL Server Basic Functions
1. String function for length and analysis
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教程有兴趣的朋友有所帮助。