Use
Demo
go
create proc proc4
as
declare @iSalary int
set @iSalary = ( select Sum (salary) from emp)
print @iSalary
go
exec proc4
create proc proc5
(
@iSalary int output
)
as
set @iSalary = ( select Sum (salary) from emp)
print @iSalary
go
declare @sals int
declare @salsback int
exec proc5 @sals output
set @salsback = @sals
print @salsback
insert into emp(userid,deptcode,salary) values ( ' ede ' , ' developer ' , ' 100 ' )
select * from emp
set identity_insert dbo.emp off
select @@identity from emp
insert into emp(userid,deptcode,salary) values ( ' w3q[=we3w ' , ' dev ' , ' 22 ' )
select @@identity from emp
alter table dbo.emp
{
alter colume
}
select * from dbo.emp
select userid,deptcode,salary,test,indentity from dbo.emp
create table tab4
(
id int identity ( 1 , 1 ) primary key ,
code uniqueidentifier default newid (),
name varchar ( 50 )
)
insert into tab4(name) values ( ' mahui ' )
select * from tab4 where id = ' mahui '
select coalesce ( null , null , null , 1 )
create table table1
(
a int ,
b int ,
c int ,
d int
)
create table table2
(
a int ,
b int ,
c int ,
d int
)
create clustered index ix_a
on dbo.table1(a)
create index ix_b
on dbo.table1(b)
create index ix_c
on dbo.table1(c)
create index ix_d
on dbo.table1(d)
create clustered index ix_a
on dbo.table2(a)
create index ix_b
on dbo.table2(b)
create index ix_c
on dbo.table2(c)
create index ix_d
on dbo.table2(d)
declare @i int
set @i = 0
while ( @i < 5 )
begin
insert into table1(a,b,c,d) values ( 1 , 1 , 1 , 1 )
set @i = @i + 1
end
declare @i int
set @i = 0
while ( @i < 200000 )
begin
insert into table2(a,b,c,d) values ( 1 , 1 , 1 , 1 )
set @i = @i + 1
end
select a from table1 where a = 1
select a from table2 where a = 1
select a from table1 where b = 1
select a from table2 where b = 1
select b from table1 where b = ' 1 '
select b from table2 where b = ' 1 '
select b from table1 where b = ' 1 '
select b from table2 where b = ' 1 '
select a,b from table1 where a = 1
select a,b from table2 where a = 1
select a,b from table1 where b = 1
select a,b from table2 where b = 1
select a,b,c from table1 where a = 1
select a,b,c from table2 where a = 1
select a,b,c from table1 where b = 1
select a,b,c from table2 where b = 1
select b,c from table1 where b = 1
select b,c from table2 where b = 1
select b,c from table1 where a = 1
select b,c from table2 where a = 1
SELECT datepart (YY, GetDate ())
SELECT datepart (DD, GetDate ())
SELECT datepart (MM, GetDate ())
SELECT datepart (SS, GetDate ())
SELECT datepart (Minute, GetDate ())
go
create proc proc4
as
declare @iSalary int
set @iSalary = ( select Sum (salary) from emp)
print @iSalary
go
exec proc4
create proc proc5
(
@iSalary int output
)
as
set @iSalary = ( select Sum (salary) from emp)
print @iSalary
go
declare @sals int
declare @salsback int
exec proc5 @sals output
set @salsback = @sals
print @salsback
insert into emp(userid,deptcode,salary) values ( ' ede ' , ' developer ' , ' 100 ' )
select * from emp
set identity_insert dbo.emp off
select @@identity from emp
insert into emp(userid,deptcode,salary) values ( ' w3q[=we3w ' , ' dev ' , ' 22 ' )
select @@identity from emp
alter table dbo.emp
{
alter colume
}
select * from dbo.emp
select userid,deptcode,salary,test,indentity from dbo.emp
create table tab4
(
id int identity ( 1 , 1 ) primary key ,
code uniqueidentifier default newid (),
name varchar ( 50 )
)
insert into tab4(name) values ( ' mahui ' )
select * from tab4 where id = ' mahui '
select coalesce ( null , null , null , 1 )
create table table1
(
a int ,
b int ,
c int ,
d int
)
create table table2
(
a int ,
b int ,
c int ,
d int
)
create clustered index ix_a
on dbo.table1(a)
create index ix_b
on dbo.table1(b)
create index ix_c
on dbo.table1(c)
create index ix_d
on dbo.table1(d)
create clustered index ix_a
on dbo.table2(a)
create index ix_b
on dbo.table2(b)
create index ix_c
on dbo.table2(c)
create index ix_d
on dbo.table2(d)
declare @i int
set @i = 0
while ( @i < 5 )
begin
insert into table1(a,b,c,d) values ( 1 , 1 , 1 , 1 )
set @i = @i + 1
end
declare @i int
set @i = 0
while ( @i < 200000 )
begin
insert into table2(a,b,c,d) values ( 1 , 1 , 1 , 1 )
set @i = @i + 1
end
select a from table1 where a = 1
select a from table2 where a = 1
select a from table1 where b = 1
select a from table2 where b = 1
select b from table1 where b = ' 1 '
select b from table2 where b = ' 1 '
select b from table1 where b = ' 1 '
select b from table2 where b = ' 1 '
select a,b from table1 where a = 1
select a,b from table2 where a = 1
select a,b from table1 where b = 1
select a,b from table2 where b = 1
select a,b,c from table1 where a = 1
select a,b,c from table2 where a = 1
select a,b,c from table1 where b = 1
select a,b,c from table2 where b = 1
select b,c from table1 where b = 1
select b,c from table2 where b = 1
select b,c from table1 where a = 1
select b,c from table2 where a = 1
SELECT datepart (YY, GetDate ())
SELECT datepart (DD, GetDate ())
SELECT datepart (MM, GetDate ())
SELECT datepart (SS, GetDate ())
SELECT datepart (Minute, GetDate ())
select
EmployeeID,
[
2001
]
,
[
2002
]
,
[
2003
]
,
[
2004
]
into
#
temp
from
( select EmployeeID, year (OrderDate) as Freight_year ,Freight from Purchasing.PurchaseOrderHeader) as ii
pivot
(
sum (Freight) for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as sa
select *
from ( select * from # temp ) as oo
unpivot
(
Freight for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as dd
from
( select EmployeeID, year (OrderDate) as Freight_year ,Freight from Purchasing.PurchaseOrderHeader) as ii
pivot
(
sum (Freight) for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as sa
select *
from ( select * from # temp ) as oo
unpivot
(
Freight for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as dd
select
*
from
Employee
--
取不到数据
select * from Employee with (nolock) -- 取到数据
select * from Employee with (readpast) -- 取到数据
update Employee set Salary = 900
EXEC sp_attach_db @dbname = N ' pubs ' ,
@filename1 = N ' E:datamssql2005pubs.mdf ' ,
@filename2 = N ' E:datamssql2005pubs_log.ldf ' ;
sp_dbcmptlevel pubs, 90
select * from Employee with (nolock) -- 取到数据
select * from Employee with (readpast) -- 取到数据
update Employee set Salary = 900
EXEC sp_attach_db @dbname = N ' pubs ' ,
@filename1 = N ' E:datamssql2005pubs.mdf ' ,
@filename2 = N ' E:datamssql2005pubs_log.ldf ' ;
sp_dbcmptlevel pubs, 90
insert
into
dbo.Contact(id,name,university,major)
values
(
100
,
'
sda
'
,
'
bb
'
,
'
cc
'
)
drop proc InputForText
Create proc InputForText
(
@input int
)
as
declare @buffer varchar ( 50 )
set @buffer = convert ( varchar ( 50 ), @input ) -- ------------------转换为字符串
-- ------------------------------------------------------------上面的先放着,用来处理数字输入
Create table NumberToChar -- ----------------------------------用来保存数字和字母之间映射的表
(
number int ,
GetText varchar ( 10 )
)
insert into NumberToChar( number ,GetText) values ( 2 , ' a ' )
insert into NumberToChar( number ,GetText) values ( 2 , ' b ' )
insert into NumberToChar( number ,GetText) values ( 2 , ' c ' )
insert into NumberToChar( number ,GetText) values ( 3 , ' d ' )
insert into NumberToChar( number ,GetText) values ( 3 , ' e ' )
insert into NumberToChar( number ,GetText) values ( 3 , ' f ' )
insert into NumberToChar( number ,GetText) values ( 4 , ' g ' )
insert into NumberToChar( number ,GetText) values ( 4 , ' h ' )
insert into NumberToChar( number ,GetText) values ( 4 , ' i ' )
insert into NumberToChar( number ,GetText) values ( 5 , ' j ' )
insert into NumberToChar( number ,GetText) values ( 5 , ' k ' )
insert into NumberToChar( number ,GetText) values ( 5 , ' l ' )
insert into NumberToChar( number ,GetText) values ( 6 , ' m ' )
insert into NumberToChar( number ,GetText) values ( 6 , ' n ' )
insert into NumberToChar( number ,GetText) values ( 6 , ' o ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' p ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' q ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' r ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' s ' )
insert into NumberToChar( number ,GetText) values ( 8 , ' t ' )
insert into NumberToChar( number ,GetText) values ( 8 , ' u ' )
insert into NumberToChar( number ,GetText) values ( 8 , ' v ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' w ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' x ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' y ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' z ' )
select * from NumberToChar
drop function Get_StrArrayLength
CREATE function Get_StrArrayLength
(
@str varchar ( 1024 ), -- 要分割的字符串
@split varchar ( 10 ) -- 分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str = ltrim ( rtrim ( @str ))
set @location = charindex ( @split , @str )
set @length = 1
while @location <> 0
begin
set @start = @location + 1
set @location = charindex ( @split , @str , @start )
set @length = @length + 1
end
return @length
end
drop function Get_StrArrayStrOfIndex
CREATE function Get_StrArrayStrOfIndex
(
@str varchar ( 1024 ), -- 要分割的字符串
@split varchar ( 10 ), -- 分隔符号
@index int -- ----------取第几个元素
)
returns varchar ( 1024 )
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str = ltrim ( rtrim ( @str ))
set @start = 1
set @next = 1
set @seed = len ( @split )
set @location = charindex ( @split , @str )
while @location <> 0 and @index > @next
begin
set @start = @location + @seed
set @location = charindex ( @split , @str , @start )
set @next = @next + 1
end
if @location = 0 select @location = len ( @str ) + 1
return substring ( @str , @start , @location - @start )
end
-- --假设分割符号为,
drop proc InputForText
Create proc InputForText
(
@input varchar ( 50 )
)
as
/**/ /*下面的几个表用来存储一些临时记录
*/
Create table #WordsStore
(
id int identity ,
WordPicker varchar ( 50 )
)
Create table #WordsOutput
(
id int identity ,
WordPicker varchar ( 50 )
)
Create table #WordsInput
(
id int identity ,
WordPicker varchar ( 50 )
)
Create table #WordsTemp
(
id int identity ,
WordPicker varchar ( 50 ),
WordPicker2 varchar ( 50 )
)
/**/ /*把输入的数字序列转换为字母组合,存放在临时表#WordsStore中
*/
declare @CharGet varchar ( 10 ) -- CharGet依次返回输入的数字
declare @CharBuffer varchar ( 100 )
declare @Next int -- 用来在遍历数字中做指针
declare @Seacher int
set @Next = 1
set @CharBuffer = '' -- 初始值为空
while @Next <= dbo.Get_StrArrayLength( @input , ' , ' )
begin
Set @CharGet = dbo.Get_StrArrayStrOfIndex( @input , ' , ' , @Next )
set @Next = @Next + 1
declare @IsExist int
set @IsExist = 0
set @IsExist = ( select count ( * ) from #WordsStore)
if @IsExist = 0
begin
insert into #WordsStore Select GetText from dbo.NumberToChar where number = @CharGet
end
else
begin
insert into #WordsInput Select GetText from dbo.NumberToChar where number = @CharGet
insert into #WordsTemp select #WordsStore.WordPicker,#WordsInput.WordPicker from #WordsStore join #WordsInput on 1 = 1
declare @Col1 varchar ( 50 )
declare @Col2 varchar ( 50 )
declare @total varchar ( 50 )
delete from #WordsStore
Declare JoinCols Cursor for
select WordPicker,WordPicker2 from #WordsTemp
open JoinCols
Fetch JoinCols into @Col1 , @Col2
while @@Fetch_Status = 0
begin
Fetch JoinCols into @Col1 , @Col2
set @total = @Col1 + @Col2
insert into #WordsStore(WordPicker) values ( @total )
end
close JoinCols
Deallocate JoinCols
delete from #WordsInput
delete from #WordsTemp
end
end
-- ------------------------ 到这里为止,完成的功能是把输入的拼音保留在#WordsStore中
Create Table #RestoreResult
( -- ----------------------- 该临时表用来存放最后搜索到的能匹配的人名记录
id int ,
name varchar ( 20 ),
university varchar ( 50 ),
major varchar ( 50 )
)
Declare @StartPY varchar ( 50 )
Declare @SeachName varchar ( 50 )
Declare PingYing Cursor for
select distinct WordPicker from #WordsStore
open PingYing
Fetch PingYing into @StartPY
while @@Fetch_Status = 0
begin -- --------------------遍历拼音的组合
Declare @WordToChoose varchar ( 1024 )
Declare SeachWord Cursor for
select words from dbo.Dictionary where py like @StartPY + ' % '
open SeachWord
Fetch SeachWord into @WordToChoose
while @@Fetch_Status = 0
begin -- ---------------查询匹配拼音的汉字
declare @Point int
set @Point = 1
while @Point <= Len ( @WordToChoose )
begin -- -----------查询匹配汉字的人名
set @SeachName = SubString ( @WordToChoose , @Point , 1 )
insert into #RestoreResult select * from dbo.Contact where name like ' % ' + @SeachName + ' % '
set @Point = @Point + 1
end
Fetch SeachWord into @WordToChoose
end
close SeachWord
Deallocate SeachWord
Fetch PingYing into @StartPY
end
close PingYing
Deallocate PingYing
-- ----------------------匹配的记录保存在#RestoreResult中
select * from #RestoreResult
print @buffer
exec InputForText ' 4,8,4 '
select * from dbo.Dictionary
select * from dbo.Contact
select * from NumberToChar
select * from #WordsInput
Declare @OutName varchar ( 20 )
set @OutName = ' 辉 '
select * from dbo.Contact where name like ' % ' + @OutName + ' % '
drop proc InputForText
Create proc InputForText
(
@input int
)
as
declare @buffer varchar ( 50 )
set @buffer = convert ( varchar ( 50 ), @input ) -- ------------------转换为字符串
-- ------------------------------------------------------------上面的先放着,用来处理数字输入
Create table NumberToChar -- ----------------------------------用来保存数字和字母之间映射的表
(
number int ,
GetText varchar ( 10 )
)
insert into NumberToChar( number ,GetText) values ( 2 , ' a ' )
insert into NumberToChar( number ,GetText) values ( 2 , ' b ' )
insert into NumberToChar( number ,GetText) values ( 2 , ' c ' )
insert into NumberToChar( number ,GetText) values ( 3 , ' d ' )
insert into NumberToChar( number ,GetText) values ( 3 , ' e ' )
insert into NumberToChar( number ,GetText) values ( 3 , ' f ' )
insert into NumberToChar( number ,GetText) values ( 4 , ' g ' )
insert into NumberToChar( number ,GetText) values ( 4 , ' h ' )
insert into NumberToChar( number ,GetText) values ( 4 , ' i ' )
insert into NumberToChar( number ,GetText) values ( 5 , ' j ' )
insert into NumberToChar( number ,GetText) values ( 5 , ' k ' )
insert into NumberToChar( number ,GetText) values ( 5 , ' l ' )
insert into NumberToChar( number ,GetText) values ( 6 , ' m ' )
insert into NumberToChar( number ,GetText) values ( 6 , ' n ' )
insert into NumberToChar( number ,GetText) values ( 6 , ' o ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' p ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' q ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' r ' )
insert into NumberToChar( number ,GetText) values ( 7 , ' s ' )
insert into NumberToChar( number ,GetText) values ( 8 , ' t ' )
insert into NumberToChar( number ,GetText) values ( 8 , ' u ' )
insert into NumberToChar( number ,GetText) values ( 8 , ' v ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' w ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' x ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' y ' )
insert into NumberToChar( number ,GetText) values ( 9 , ' z ' )
select * from NumberToChar
drop function Get_StrArrayLength
CREATE function Get_StrArrayLength
(
@str varchar ( 1024 ), -- 要分割的字符串
@split varchar ( 10 ) -- 分隔符号
)
returns int
as
begin
declare @location int
declare @start int
declare @length int
set @str = ltrim ( rtrim ( @str ))
set @location = charindex ( @split , @str )
set @length = 1
while @location <> 0
begin
set @start = @location + 1
set @location = charindex ( @split , @str , @start )
set @length = @length + 1
end
return @length
end
drop function Get_StrArrayStrOfIndex
CREATE function Get_StrArrayStrOfIndex
(
@str varchar ( 1024 ), -- 要分割的字符串
@split varchar ( 10 ), -- 分隔符号
@index int -- ----------取第几个元素
)
returns varchar ( 1024 )
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str = ltrim ( rtrim ( @str ))
set @start = 1
set @next = 1
set @seed = len ( @split )
set @location = charindex ( @split , @str )
while @location <> 0 and @index > @next
begin
set @start = @location + @seed
set @location = charindex ( @split , @str , @start )
set @next = @next + 1
end
if @location = 0 select @location = len ( @str ) + 1
return substring ( @str , @start , @location - @start )
end
-- --假设分割符号为,
drop proc InputForText
Create proc InputForText
(
@input varchar ( 50 )
)
as
/**/ /*下面的几个表用来存储一些临时记录
*/
Create table #WordsStore
(
id int identity ,
WordPicker varchar ( 50 )
)
Create table #WordsOutput
(
id int identity ,
WordPicker varchar ( 50 )
)
Create table #WordsInput
(
id int identity ,
WordPicker varchar ( 50 )
)
Create table #WordsTemp
(
id int identity ,
WordPicker varchar ( 50 ),
WordPicker2 varchar ( 50 )
)
/**/ /*把输入的数字序列转换为字母组合,存放在临时表#WordsStore中
*/
declare @CharGet varchar ( 10 ) -- CharGet依次返回输入的数字
declare @CharBuffer varchar ( 100 )
declare @Next int -- 用来在遍历数字中做指针
declare @Seacher int
set @Next = 1
set @CharBuffer = '' -- 初始值为空
while @Next <= dbo.Get_StrArrayLength( @input , ' , ' )
begin
Set @CharGet = dbo.Get_StrArrayStrOfIndex( @input , ' , ' , @Next )
set @Next = @Next + 1
declare @IsExist int
set @IsExist = 0
set @IsExist = ( select count ( * ) from #WordsStore)
if @IsExist = 0
begin
insert into #WordsStore Select GetText from dbo.NumberToChar where number = @CharGet
end
else
begin
insert into #WordsInput Select GetText from dbo.NumberToChar where number = @CharGet
insert into #WordsTemp select #WordsStore.WordPicker,#WordsInput.WordPicker from #WordsStore join #WordsInput on 1 = 1
declare @Col1 varchar ( 50 )
declare @Col2 varchar ( 50 )
declare @total varchar ( 50 )
delete from #WordsStore
Declare JoinCols Cursor for
select WordPicker,WordPicker2 from #WordsTemp
open JoinCols
Fetch JoinCols into @Col1 , @Col2
while @@Fetch_Status = 0
begin
Fetch JoinCols into @Col1 , @Col2
set @total = @Col1 + @Col2
insert into #WordsStore(WordPicker) values ( @total )
end
close JoinCols
Deallocate JoinCols
delete from #WordsInput
delete from #WordsTemp
end
end
-- ------------------------ 到这里为止,完成的功能是把输入的拼音保留在#WordsStore中
Create Table #RestoreResult
( -- ----------------------- 该临时表用来存放最后搜索到的能匹配的人名记录
id int ,
name varchar ( 20 ),
university varchar ( 50 ),
major varchar ( 50 )
)
Declare @StartPY varchar ( 50 )
Declare @SeachName varchar ( 50 )
Declare PingYing Cursor for
select distinct WordPicker from #WordsStore
open PingYing
Fetch PingYing into @StartPY
while @@Fetch_Status = 0
begin -- --------------------遍历拼音的组合
Declare @WordToChoose varchar ( 1024 )
Declare SeachWord Cursor for
select words from dbo.Dictionary where py like @StartPY + ' % '
open SeachWord
Fetch SeachWord into @WordToChoose
while @@Fetch_Status = 0
begin -- ---------------查询匹配拼音的汉字
declare @Point int
set @Point = 1
while @Point <= Len ( @WordToChoose )
begin -- -----------查询匹配汉字的人名
set @SeachName = SubString ( @WordToChoose , @Point , 1 )
insert into #RestoreResult select * from dbo.Contact where name like ' % ' + @SeachName + ' % '
set @Point = @Point + 1
end
Fetch SeachWord into @WordToChoose
end
close SeachWord
Deallocate SeachWord
Fetch PingYing into @StartPY
end
close PingYing
Deallocate PingYing
-- ----------------------匹配的记录保存在#RestoreResult中
select * from #RestoreResult
print @buffer
exec InputForText ' 4,8,4 '
select * from dbo.Dictionary
select * from dbo.Contact
select * from NumberToChar
select * from #WordsInput
Declare @OutName varchar ( 20 )
set @OutName = ' 辉 '
select * from dbo.Contact where name like ' % ' + @OutName + ' % '
sp_lock
52
select @@spid
select db_name ( 11 )
sp_helpdb
select object_name ( 2073058421 )
select db_id ( ' Trans ' )
select object_id ( ' NonPrimaryKey ' )
1 : 120 : 0 第一个文件第120页第0行
select * from sys.database_files
在数据库的views里的system views里的metadata很有用
如果该行有聚集索引,则上一个索引的行索
select @@Trancount
sp_lock 52
select @@spid
sp_help ' Trans '
sp_help NonPrimaryKey
select object_name ( 2105058535 )
select @@spid
select db_name ( 11 )
sp_helpdb
select object_name ( 2073058421 )
select db_id ( ' Trans ' )
select object_id ( ' NonPrimaryKey ' )
1 : 120 : 0 第一个文件第120页第0行
select * from sys.database_files
在数据库的views里的system views里的metadata很有用
如果该行有聚集索引,则上一个索引的行索
select @@Trancount
sp_lock 52
select @@spid
sp_help ' Trans '
sp_help NonPrimaryKey
select object_name ( 2105058535 )
Create
DataBase
Trans
use Trans
create table NonPrimaryKey
(
UserID varchar ( 50 ),
Salary int
)
insert into NonPrimaryKey values ( ' mahui ' , ' 20 ' )
insert into NonPrimaryKey values ( ' Qiuwh ' , ' 60 ' )
insert into NonPrimaryKey values ( ' HuangH ' , ' 80 ' )
insert into NonPrimaryKey values ( ' HAHA ' , ' 100 ' )
insert into NonPrimaryKey values ( ' mahui ' , ' 20 ' )
insert into NonPrimaryKey values ( ' mahui ' , ' 20 ' )
Begin Tran
Update NonPrimaryKey Set Salary = 200 where UserID = ' Qiuwh '
update NonPrimaryKey Set UserID = ' haha ' where Salary = ' 100 '
select @@spid
rollback
select * from NonPrimaryKey with ( holdlock )事务结束后释放锁
select * from NonPrimaryKey with (Repeatableread,paglock)跟holdlock是一样的
select * from NonPrimaryKey with (Repeatableread,paglock)paglock可以指定锁的颗粒
select * from NonPrimaryKey with (nolock) / with (ReadUnCommited)不加任何锁
select * from NonPrimaryKey with (readpast)上共享锁,但是跳过排他锁,不读取未提交数据
select * from NonPrimaryKey with (nowait)碰到排他锁就抛异常
set lock_timeout 3000
DBCC UserOptions
select * from NonPrimaryKey
begin tran
alter table NonPrimaryKey
add test varchar ( 20 )
rollback
select @@trancount
rollback
begin tran
select * from NonPrimaryKey with ( holdlock )
set transaction isolation level read uncommitted
set transaction isolation level read committed
set transaction isolation level repeatable read
set transaction isolation level Serializable
set transaction isolation level Snapshot // 2005新特性
sp_help NonPrimaryKey
select * from NonPrimaryKey
Begin Tran
set transaction isolation level read uncommitted
update NonPrimaryKey set UserID = ' yujia ' where Salary = ' 20 '
insert into NonPrimaryKey values ( ' YULA ' , ' 120 ' )
Rollback
Begin Tran
set transaction isolation level read committed
update NonPrimaryKey set UserID = ' yujia ' where Salary = ' 20 '
insert into NonPrimaryKey values ( ' YULA ' , ' 120 ' )
Rollback
Begin Tran
set transaction isolation level repeatable read
update NonPrimaryKey set UserID = ' yujia ' where Salary = ' 20 '
insert into NonPrimaryKey values ( ' YULA ' , ' 120 ' )
Rollback
Begin Tran
set transaction isolation level Serializable
insert into NonPrimaryKey values ( ' HAHA ' , ' 120 ' )
update NonPrimaryKey set UserID = ' YULA ' where Salary = ' 20 '
Rollback
Begin Tran
set transaction isolation level Snapshot
insert into NonPrimaryKey values ( ' HAHA ' , ' 120 ' )
update NonPrimaryKey set UserID = ' YULA ' where Salary = ' 20 '
Rollback
-- dead lock
create table t1
(
id int primary key ,
val varchar ( 20 ) not null
)
create table t2
(
id int primary key ,
val varchar ( 20 ) not null
)
insert into t1 values ( 1 , ' 11111 ' )
insert into t2 values ( 2 , ' 11111 ' )
-- session 1
begin tran
update t1 set val = ' new value ' where id = 1 -- t1时刻
update t2 set val = ' new value ' where id = 2 -- t3时刻
commit
-- session 2
begin tran
update t2 set val = ' new value ' where id = 1 -- t2时刻
update t1 set val = ' new value ' where id = 1 -- t4时刻
commit
DbCC UserOptions
select * from t2
sp_lock
xact_state() = - 1表示事务是活动的,但是出现了严重的错误
xact_state() = 1表示事务是活动的,并且事务可以被commit,即使出现了一些错误
xact_state() = 0表示事没有活动的
用begin try
end try
begin catch
end catch
来保证运行正确,不会出现xact_state() = 1中可能出现的出现了部分错误结果还是能提交的问题
use Trans
create table NonPrimaryKey
(
UserID varchar ( 50 ),
Salary int
)
insert into NonPrimaryKey values ( ' mahui ' , ' 20 ' )
insert into NonPrimaryKey values ( ' Qiuwh ' , ' 60 ' )
insert into NonPrimaryKey values ( ' HuangH ' , ' 80 ' )
insert into NonPrimaryKey values ( ' HAHA ' , ' 100 ' )
insert into NonPrimaryKey values ( ' mahui ' , ' 20 ' )
insert into NonPrimaryKey values ( ' mahui ' , ' 20 ' )
Begin Tran
Update NonPrimaryKey Set Salary = 200 where UserID = ' Qiuwh '
update NonPrimaryKey Set UserID = ' haha ' where Salary = ' 100 '
select @@spid
rollback
select * from NonPrimaryKey with ( holdlock )事务结束后释放锁
select * from NonPrimaryKey with (Repeatableread,paglock)跟holdlock是一样的
select * from NonPrimaryKey with (Repeatableread,paglock)paglock可以指定锁的颗粒
select * from NonPrimaryKey with (nolock) / with (ReadUnCommited)不加任何锁
select * from NonPrimaryKey with (readpast)上共享锁,但是跳过排他锁,不读取未提交数据
select * from NonPrimaryKey with (nowait)碰到排他锁就抛异常
set lock_timeout 3000
DBCC UserOptions
select * from NonPrimaryKey
begin tran
alter table NonPrimaryKey
add test varchar ( 20 )
rollback
select @@trancount
rollback
begin tran
select * from NonPrimaryKey with ( holdlock )
set transaction isolation level read uncommitted
set transaction isolation level read committed
set transaction isolation level repeatable read
set transaction isolation level Serializable
set transaction isolation level Snapshot // 2005新特性
sp_help NonPrimaryKey
select * from NonPrimaryKey
Begin Tran
set transaction isolation level read uncommitted
update NonPrimaryKey set UserID = ' yujia ' where Salary = ' 20 '
insert into NonPrimaryKey values ( ' YULA ' , ' 120 ' )
Rollback
Begin Tran
set transaction isolation level read committed
update NonPrimaryKey set UserID = ' yujia ' where Salary = ' 20 '
insert into NonPrimaryKey values ( ' YULA ' , ' 120 ' )
Rollback
Begin Tran
set transaction isolation level repeatable read
update NonPrimaryKey set UserID = ' yujia ' where Salary = ' 20 '
insert into NonPrimaryKey values ( ' YULA ' , ' 120 ' )
Rollback
Begin Tran
set transaction isolation level Serializable
insert into NonPrimaryKey values ( ' HAHA ' , ' 120 ' )
update NonPrimaryKey set UserID = ' YULA ' where Salary = ' 20 '
Rollback
Begin Tran
set transaction isolation level Snapshot
insert into NonPrimaryKey values ( ' HAHA ' , ' 120 ' )
update NonPrimaryKey set UserID = ' YULA ' where Salary = ' 20 '
Rollback
-- dead lock
create table t1
(
id int primary key ,
val varchar ( 20 ) not null
)
create table t2
(
id int primary key ,
val varchar ( 20 ) not null
)
insert into t1 values ( 1 , ' 11111 ' )
insert into t2 values ( 2 , ' 11111 ' )
-- session 1
begin tran
update t1 set val = ' new value ' where id = 1 -- t1时刻
update t2 set val = ' new value ' where id = 2 -- t3时刻
commit
-- session 2
begin tran
update t2 set val = ' new value ' where id = 1 -- t2时刻
update t1 set val = ' new value ' where id = 1 -- t4时刻
commit
DbCC UserOptions
select * from t2
sp_lock
xact_state() = - 1表示事务是活动的,但是出现了严重的错误
xact_state() = 1表示事务是活动的,并且事务可以被commit,即使出现了一些错误
xact_state() = 0表示事没有活动的
用begin try
end try
begin catch
end catch
来保证运行正确,不会出现xact_state() = 1中可能出现的出现了部分错误结果还是能提交的问题
--
---------------------------------------------------Day3-----------------------------------------------------------
-- ------------------------------------------------------------------------------------------------------------------
create table EmpSalary
(
UserID varchar ( 50 ) primary key ,
DeptCode varchar ( 50 ) not null ,
Salary float
);
insert into EmpSalary values ( ' chenb ' , ' dev1 ' , 300 );
insert into EmpSalary values ( ' lizm ' , ' dev1 ' , 200 );
insert into EmpSalary values ( ' weisg ' , ' dev1 ' , null );
insert into EmpSalary values ( ' qiuwh ' , ' rd ' , 100 );
insert into EmpSalary values ( ' zhumd ' , ' rd ' , 200 );
insert into EmpSalary values ( ' yuanlh ' , ' rd ' , 100 );
select * from EmpSalary
select avg ( distinct isnull (salary, 0 )) from EmpSalary
select count ( distinct Salary) from EmpSalary
select * from empsalary
update empsalary set salary = - 100 where userid = ' chenb '
select salary from empsalary
select abs (salary) from empsalary
select count ( distinct abs (salary)) from empsalary
select avg ( isnull (salary, 50 )) from EmpSalary
select sin ( pi () / 6 )
drop table ProductSale;
create table ProductSale
(
id int identity primary key ,
Product varchar ( 50 ),
SaleMonth int ,
Sale int
);
insert into ProductSale values ( ' Book ' , 1 , 140 );
insert into ProductSale values ( ' Book ' , 2 , 220 );
insert into ProductSale values ( ' Book ' , 3 , 360 );
insert into ProductSale values ( ' Book ' , 4 , 240 );
insert into ProductSale values ( ' Toy ' , 1 , 220 );
insert into ProductSale values ( ' Toy ' , 2 , 310 );
insert into ProductSale values ( ' Toy ' , 3 , 120 );
insert into ProductSale values ( ' Toy ' , 4 , 220 );
-- -------------------------------------------
insert into ProductSale Values ( null , 1 , 0 );
insert into ProductSale Values ( null , 2 , 0 );
insert into ProductSale Values ( null , 3 , 0 );
insert into ProductSale Values ( null , 4 , 0 );
select * from ProductSale
select DeptCode, sum (salary) as total from EmpSalary group by deptcode
select DeptCode, Sum ()
select product, sum (sale) as ' sale '
from productsale
group by product
order by product
select salemonth, sum (sale) as ' sale '
from productsale
group by salemonth
order by salemonth
select * from productsale
select count ( distinct (sale)) from productsale
select product,salemonth, sum (sale) as ' sale ' ,id
from productsale
group by product,salemonth,id with rollup
order by product,salemonth
select product,salemonth, sum (sale) as ' sale '
from productsale
group by product,salemonth with rollup
order by product,salemonth
select product,salemonth, sum (sale) as ' sale '
from productsale
group by salemonth,product with rollup
order by product,salemonth
select product,salemonth, sum (sale) as ' sale ' ,id
from productsale
group by salemonth,product,id with rollup
order by product,salemonth
select product,salemonth ,id, sum (sale) as ' sale '
from productsale
group by salemonth,product,id with cube
order by product,salemonth,id
select product,salemonth, sum (sale) as ' sale '
from productsale
group by salemonth,product with cube
order by product,salemonth
select * from empsalary group by deptcode having salary > 100
select product = case
when (product is null ) and ( grouping (product) = 1 ) and (salemonth is not null ) then ' xiaoji '
when (product is null ) and ( grouping (product) = 1 ) and (salemonth is null ) and ( grouping (salemonth) = 1 ) then ' zongji '
else product end ,
salemonth, sum (sale) as ' sale ' , grouping (product), grouping (salemonth)
from productsale
group by salemonth,product with rollup
order by salemonth,product
select isnull (product, 0 ) product = case
when (product is null ) and (salemonth is not null ) then ' xiaoji '
when (product is null ) and (salemonth is null ) then ' zongji '
else product end ,
salemonth, sum (sale) as ' sale ' , grouping (product), grouping (salemonth)
from productsale
group by salemonth,product with rollup
order by salemonth,product
select isnull (product, 0 ) as product
salemonth, sum (sale) as ' sale ' , grouping (product), grouping (salemonth)
from productsale
group by salemonth,product with rollup
order by salemonth,product
select * from productsale
order by product,salemonth desc
compute sum (sale) by product,salemonth
select * from productsale
select product ,sale, rank() over (partition by product order by sale ) as ' rank '
from productsale
select product ,sale, dense_rank() over (partition by product order by sale ) as ' denserank '
from productsale
select product ,sale, row_number() over (partition by product order by sale ) as ' denserank '
from productsale
select product ,sale, ntile( 2 ) over (partition by product order by sale ) as ' denserank '
from productsale
select product ,sale, denserank() over (partition by product order by sale ) as ' denserank '
from productsale
delete from productsale where product is null
select product, [ 1 ] as ' 1 ' , [ 2 ] as ' 2 ' , [ 3 ] as ' 3 ' , [ 4 ] as ' 4 '
from
(
select product,salemonth,sale from productsale
) as ps
pivot
(
sum (sale) for salemonth in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
) as pvt
select * from productsale
select id, salemonth,book,toy
from
(
select id, product,salemonth,sale from productsale
) as ps
pivot
(
sum (sale) for product in (book,toy)
) as pvt
select * from productsale group by salemonth,product
select product, [ 1 ] as ' 1 ' , [ 2 ] as ' 2 ' , [ 3 ] as ' 3 ' , [ 4 ] as ' 4 '
from
(
select product,salemonth,sale from productsale
) as ps
pivot
(
sum (sale) for salemonth in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
) as pvt
select * from
( select product, [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] from # temp ) as tp
unpivot
(
sale for salemonth in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
) as pvt
select EmployeeID, [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] into # temp
from
( select EmployeeID, year (OrderDate) as Freight_year ,Freight from Purchasing.PurchaseOrderHeader) as ii
pivot
(
sum (Freight) for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as sa
select *
from ( select * from # temp ) as oo
unpivot
(
Freight for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as dd
-- ----------------------------------------------------------------------------------------------------------------------
-- -----------------------------------Day4-----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------------------------------------------------
-- 使用连接
create Database demo
use demo
create table Employee
(
UserID varchar ( 50 ) primary key ,
DeptCode varchar ( 50 ),
Salary int
);
insert into Employee values ( ' qiuwh ' , ' rd ' , 100 );
insert into Employee values ( ' yuanlh ' , ' rd ' , 200 );
insert into Employee values ( ' liying ' , ' dev1 ' , 300 );
insert into Employee values ( ' chenb ' , ' dev1 ' , 100 );
insert into Employee values ( ' wuyang ' , ' dev2 ' , 300 );
insert into Employee values ( ' longj ' , ' dev2 ' , 200 );
create table Dept
(
DeptCode varchar ( 50 ) primary key ,
DeptName varchar ( 50 )
);
insert into Dept values ( ' rd ' , ' 研发中心 ' );
insert into Dept values ( ' dev1 ' , ' 开发一部 ' );
insert into Dept values ( ' mgrcenter ' , ' 管理中心 ' );
-- ---使用CROSS JOIN生成测试数据
CREATE TABLE FirstName (firstname nvarchar ( 50 ) not null )
CREATE TABLE MiddleName (middlename nvarchar ( 50 ) not null )
CREATE TABLE LastName (lastname nvarchar ( 50 ) not null )
INSERT into FirstName values ( ' Jack ' )
INSERT into FirstName values ( ' Jill ' )
INSERT into FirstName values ( ' Tom ' )
INSERT into FirstName values ( ' Dick ' )
INSERT into FirstName values ( ' Harry ' )
INSERT into FirstName values ( ' Robert ' )
INSERT into FirstName values ( ' Peter ' )
INSERT into FirstName values ( ' David ' )
INSERT into FirstName values ( ' Susan ' )
INSERT into FirstName values ( ' Mary ' )
INSERT into MiddleName values ( ' A ' )
INSERT into MiddleName values ( ' B ' )
INSERT into MiddleName values ( ' C ' )
INSERT into MiddleName values ( ' D ' )
INSERT into MiddleName values ( ' E ' )
INSERT into MiddleName values ( ' F ' )
INSERT into MiddleName values ( ' G ' )
INSERT into MiddleName values ( ' H ' )
INSERT into MiddleName values ( ' I ' )
INSERT into MiddleName values ( ' J ' )
INSERT into LastName values ( ' Smith ' )
INSERT into LastName values ( ' Lamb ' )
INSERT into LastName values ( ' Ron ' )
INSERT into LastName values ( ' Peterson ' )
INSERT into LastName values ( ' Paul ' )
INSERT into LastName values ( ' Black ' )
INSERT into LastName values ( ' Brown ' )
INSERT into LastName values ( ' Adams ' )
INSERT into LastName values ( ' Diaz ' )
INSERT into LastName values ( ' Hall ' )
-- -----使用UNION
use demo
create table A ( val int );
create table B ( val int );
insert into A values ( 1 );
insert into A values ( 2 );
insert into A values ( 2 );
insert into A values ( 3 );
insert into A values ( 4 );
insert into B values ( 2 );
insert into B values ( 4 );
insert into B values ( 6 );
insert into B values ( 6 );
insert into B values ( 7 );
select * from Employee
select * from Dept
-- ------------------inner join------------------------
select *
from Employee e
inner join Dept d on e.DeptCode = d.deptcode
select *
from Employee e
join Dept d on e.DeptCode = d.deptcode
select *
from Employee e , Dept d where e.DeptCode = d.deptcode
-- --------------left join----------------------------
select *
from Employee e
left join Dept d on e.DeptCode = d.deptcode
-- --------------right join----------------------------
select *
from Employee e
right join Dept d on e.DeptCode = d.deptcode
-- left join equal to right join
select e.userId,e.deptcode,e.salary,d.deptcode,d.deptname
from Dept d
right join Employee e on e.DeptCode = d.deptcode
except -- --------what's union?
select e.userId,e.deptcode,e.salary,d.deptcode,d.deptname
from Employee e
left join Dept d on e.DeptCode = d.deptcode
-- -------------------cross join-----------------------
select *
from FirstName
cross join Middlename
cross join lastname
-- ---------------------------Multitable join---------------
use AdventureWorks
select *
from Purchasing.Vendor v
inner join Purchasing.ProductVendor pv on v. VendorID = pv. VendorID
inner join Production.Product p on p.ProductID = pv.ProductID
-- -------------------join self----------------------------------
select e.EmployeeID,e.LoginID,e.ManagerID,f.LoginID
from HumanResources.Employee e
left join HumanResources.Employee f on e.ManagerID = f.EmployeeID
select e.ProductID,e.ListPrice,f.ProductID,f.ListPrice
from Production.Product e
join Production.Product f on e.ListPrice < f.ListPrice
order by e.ProductID
select a, count (c)
from
(
select e.ProductID a,e.ListPrice b ,f.ProductID c ,f.ListPrice d
from Production.Product e
join Production.Product f on e.ListPrice < f.ListPrice
) as haha
group by a
-- -------------------union ----------------------------------------
-- ---------可以用group by在子句里,但是不能用order bY 在子句里
-- --------order by 只能在所有子句的外面最后使用
use Demo
drop table A,B
select * from A
union
select * from B
select * from A
union all
select * from B
select * from A
union all
select * from B
order by val
select * from A
except
select * from B
order by val
select * from A
intersect
select * from B
order by val
select top 2 * from Employee
select top 10 percent * from Employee
declare @i int
set @i = 50
select top ( @i ) percent * from Employee
select [ Name ]
from Production.Product
where ListPrice >
(
select avg ( ListPrice) from Production.Product
)
select *
from Production.Product prod
where ProductModelID in
(
select ProductModelID from Production.ProductModel where Name like ' Road% '
)
select tmp.Name,prod.ProductID
from Production.Product prod,
(
select ProductModelID,Name from Production.ProductModel where Name like ' Road% '
) tmp
where tmp.ProductModelID = prod.ProductModelID
except
select tmp.Name,prod.ProductID
from Production.Product prod
join Production.ProductModel tmp
on tmp.ProductModelID = prod.ProductModelID and tmp.Name like ' Road% '
-
-- -----all
-- --------some|any
-- -----------------不允许在子查询中使用order by子句,但是,如果top子句被指定的话,这是可以使用order by 子句的
select * from Production.Product
Where ProductModelID in
(
select top 10 ProductModelID from Production.ProductModel
where Name like ' Road% '
order by ProductModelID
)
-- --------------------不允许在子查询中使用Computer子句
-- --------------------text ,ntext ,image 大对象是不能放进子查询里的
-- on same Table
select distinct ProductID,OrderQty
from Sales.SalesOrderDetail as sod_outer
where OrderQty =
(
select Max (OrderQty)
from Sales.SalesOrderDetail as sod_inner
where sod_outer.ProductID = sod_inner.ProductID
)
-- except
select ProductID, Max (OrderQty) as OrderQty
from Sales.SalesOrderDetail
group by ProductID
select distinct ProductID, Max (OrderQty) as OrderQty
from Sales.SalesOrderDetail
group by ProductID
select SalesOrderID,ProductID,OrderQty
from Sales.SalesOrderDetail as sod_outer
where OrderQty >=
(
select avg (OrderQty) * 10
from Sales.SalesOrderDetail as sod_inner
where sod_outer.ProductID = sod_inner.ProductID
)
-- --difference table
select * from Sales.SalesPerson
select * from Sales.SalesOrderHeader
select ss_outer.SalesPersonID
from Sales.SalesPerson as ss_outer
where 2000 <=
(
select ss_outer.CommissionPct * ss_inner.TotalDue)
from Sales.SalesOrderHeader as ss_inner
where ss_outer.SalesPersonID = ss_inner.SalesPersonID
)
select ss_outer.SalesPersonID
from Sales.SalesPerson as ss_outer
where 2000 <=
(
select max (ss_inner.TotalDue) * ss_outer.CommissionPct
from Sales.SalesOrderHeader as ss_inner
where ss_outer.SalesPersonID = ss_inner.SalesPersonID
)
order by ss_outer.SalesPersonID
select SalesPersonID
from Sales.SalesPerson
group by SalesPersonID
having SalesPersonID = 288
select * from Production.Product
select * from Production.ProductInventory
-- --在exists后面可以直接用*来代替列名是可以的,因为它并不真的取值出来
select distinct ProductID,Name
from Production.Product pr
where exists
( select * from Production.ProductInventory inv
where pr.ProductID = inv.ProductID and Quantity > 500
)
except
select pr.ProductID,pr.Name
from Production.Product pr
join Production.ProductInventory inv on pr.ProductID = inv.ProductID and Quantity > 500
select * from Production.Product
where ProductModelID in
(
select ProductModelID from Production.ProductModel where Name like ' Road% '
)
except
select * from Production.Product pp
where Exists
(
select ProductModelID from Production.ProductModel ppm where ppm.Name like ' Road% ' and pp.ProductModelID = ppm.ProductModelID
)
with TopSales(SalespersonID,NumSales) as
(
select SalesPersonID, Count ( * )
from Sales.SalesOrderHeader
Group BY SalesPersonID
)
select top ( 5 ) * from TopSales where SalespersonID is not null
order by NumSales desc
use demo
with Emp as
(
select * from Employee where deptCode = ' rd '
),
Dep as
(
select * from Dept
)
select * from Emp,Dep where Emp.DeptCode = dep.DeptCode]]]
first test
with Managers as
(
select EmployeeID,LoginID,Title,ManagerID
From HumanResources.Employee
where EmployeeID = 107
union all
Select e.EmployeeID,e.LoginID,e.Title,e.ManagerID
From HumanResources.Employee e
inner join Managers mgr
on e.EmployeeID = mgr.ManagerID
)
select * From Managers
option (maxrecursion 2 )
USE [ Demo ]
GO
/**/ /****** Object: Table [dbo].[EmpSalary] Script Date: 07/19/2006 10:17:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [ dbo ] . [ EmpSalary ] (
[ UserID ] [ varchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ DeptCode ] [ varchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ Salary ] [ float ] NULL ,
PRIMARY KEY CLUSTERED
(
[ UserID ] ASC
) WITH (IGNORE_DUP_KEY = OFF ) ON [ PRIMARY ]
) ON [ PRIMARY ]
GO
SET ANSI_PADDING OFF
-- ------------------------------------------------------------------------------------------------------------------
create table EmpSalary
(
UserID varchar ( 50 ) primary key ,
DeptCode varchar ( 50 ) not null ,
Salary float
);
insert into EmpSalary values ( ' chenb ' , ' dev1 ' , 300 );
insert into EmpSalary values ( ' lizm ' , ' dev1 ' , 200 );
insert into EmpSalary values ( ' weisg ' , ' dev1 ' , null );
insert into EmpSalary values ( ' qiuwh ' , ' rd ' , 100 );
insert into EmpSalary values ( ' zhumd ' , ' rd ' , 200 );
insert into EmpSalary values ( ' yuanlh ' , ' rd ' , 100 );
select * from EmpSalary
select avg ( distinct isnull (salary, 0 )) from EmpSalary
select count ( distinct Salary) from EmpSalary
select * from empsalary
update empsalary set salary = - 100 where userid = ' chenb '
select salary from empsalary
select abs (salary) from empsalary
select count ( distinct abs (salary)) from empsalary
select avg ( isnull (salary, 50 )) from EmpSalary
select sin ( pi () / 6 )
drop table ProductSale;
create table ProductSale
(
id int identity primary key ,
Product varchar ( 50 ),
SaleMonth int ,
Sale int
);
insert into ProductSale values ( ' Book ' , 1 , 140 );
insert into ProductSale values ( ' Book ' , 2 , 220 );
insert into ProductSale values ( ' Book ' , 3 , 360 );
insert into ProductSale values ( ' Book ' , 4 , 240 );
insert into ProductSale values ( ' Toy ' , 1 , 220 );
insert into ProductSale values ( ' Toy ' , 2 , 310 );
insert into ProductSale values ( ' Toy ' , 3 , 120 );
insert into ProductSale values ( ' Toy ' , 4 , 220 );
-- -------------------------------------------
insert into ProductSale Values ( null , 1 , 0 );
insert into ProductSale Values ( null , 2 , 0 );
insert into ProductSale Values ( null , 3 , 0 );
insert into ProductSale Values ( null , 4 , 0 );
select * from ProductSale
select DeptCode, sum (salary) as total from EmpSalary group by deptcode
select DeptCode, Sum ()
select product, sum (sale) as ' sale '
from productsale
group by product
order by product
select salemonth, sum (sale) as ' sale '
from productsale
group by salemonth
order by salemonth
select * from productsale
select count ( distinct (sale)) from productsale
select product,salemonth, sum (sale) as ' sale ' ,id
from productsale
group by product,salemonth,id with rollup
order by product,salemonth
select product,salemonth, sum (sale) as ' sale '
from productsale
group by product,salemonth with rollup
order by product,salemonth
select product,salemonth, sum (sale) as ' sale '
from productsale
group by salemonth,product with rollup
order by product,salemonth
select product,salemonth, sum (sale) as ' sale ' ,id
from productsale
group by salemonth,product,id with rollup
order by product,salemonth
select product,salemonth ,id, sum (sale) as ' sale '
from productsale
group by salemonth,product,id with cube
order by product,salemonth,id
select product,salemonth, sum (sale) as ' sale '
from productsale
group by salemonth,product with cube
order by product,salemonth
select * from empsalary group by deptcode having salary > 100
select product = case
when (product is null ) and ( grouping (product) = 1 ) and (salemonth is not null ) then ' xiaoji '
when (product is null ) and ( grouping (product) = 1 ) and (salemonth is null ) and ( grouping (salemonth) = 1 ) then ' zongji '
else product end ,
salemonth, sum (sale) as ' sale ' , grouping (product), grouping (salemonth)
from productsale
group by salemonth,product with rollup
order by salemonth,product
select isnull (product, 0 ) product = case
when (product is null ) and (salemonth is not null ) then ' xiaoji '
when (product is null ) and (salemonth is null ) then ' zongji '
else product end ,
salemonth, sum (sale) as ' sale ' , grouping (product), grouping (salemonth)
from productsale
group by salemonth,product with rollup
order by salemonth,product
select isnull (product, 0 ) as product
salemonth, sum (sale) as ' sale ' , grouping (product), grouping (salemonth)
from productsale
group by salemonth,product with rollup
order by salemonth,product
select * from productsale
order by product,salemonth desc
compute sum (sale) by product,salemonth
select * from productsale
select product ,sale, rank() over (partition by product order by sale ) as ' rank '
from productsale
select product ,sale, dense_rank() over (partition by product order by sale ) as ' denserank '
from productsale
select product ,sale, row_number() over (partition by product order by sale ) as ' denserank '
from productsale
select product ,sale, ntile( 2 ) over (partition by product order by sale ) as ' denserank '
from productsale
select product ,sale, denserank() over (partition by product order by sale ) as ' denserank '
from productsale
delete from productsale where product is null
select product, [ 1 ] as ' 1 ' , [ 2 ] as ' 2 ' , [ 3 ] as ' 3 ' , [ 4 ] as ' 4 '
from
(
select product,salemonth,sale from productsale
) as ps
pivot
(
sum (sale) for salemonth in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
) as pvt
select * from productsale
select id, salemonth,book,toy
from
(
select id, product,salemonth,sale from productsale
) as ps
pivot
(
sum (sale) for product in (book,toy)
) as pvt
select * from productsale group by salemonth,product
select product, [ 1 ] as ' 1 ' , [ 2 ] as ' 2 ' , [ 3 ] as ' 3 ' , [ 4 ] as ' 4 '
from
(
select product,salemonth,sale from productsale
) as ps
pivot
(
sum (sale) for salemonth in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
) as pvt
select * from
( select product, [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] from # temp ) as tp
unpivot
(
sale for salemonth in ( [ 1 ] , [ 2 ] , [ 3 ] , [ 4 ] )
) as pvt
select EmployeeID, [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] into # temp
from
( select EmployeeID, year (OrderDate) as Freight_year ,Freight from Purchasing.PurchaseOrderHeader) as ii
pivot
(
sum (Freight) for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as sa
select *
from ( select * from # temp ) as oo
unpivot
(
Freight for Freight_year in ( [ 2001 ] , [ 2002 ] , [ 2003 ] , [ 2004 ] )
) as dd
-- ----------------------------------------------------------------------------------------------------------------------
-- -----------------------------------Day4-----------------------------------------------------------------------------
-- ----------------------------------------------------------------------------------------------------------------------
-- 使用连接
create Database demo
use demo
create table Employee
(
UserID varchar ( 50 ) primary key ,
DeptCode varchar ( 50 ),
Salary int
);
insert into Employee values ( ' qiuwh ' , ' rd ' , 100 );
insert into Employee values ( ' yuanlh ' , ' rd ' , 200 );
insert into Employee values ( ' liying ' , ' dev1 ' , 300 );
insert into Employee values ( ' chenb ' , ' dev1 ' , 100 );
insert into Employee values ( ' wuyang ' , ' dev2 ' , 300 );
insert into Employee values ( ' longj ' , ' dev2 ' , 200 );
create table Dept
(
DeptCode varchar ( 50 ) primary key ,
DeptName varchar ( 50 )
);
insert into Dept values ( ' rd ' , ' 研发中心 ' );
insert into Dept values ( ' dev1 ' , ' 开发一部 ' );
insert into Dept values ( ' mgrcenter ' , ' 管理中心 ' );
-- ---使用CROSS JOIN生成测试数据
CREATE TABLE FirstName (firstname nvarchar ( 50 ) not null )
CREATE TABLE MiddleName (middlename nvarchar ( 50 ) not null )
CREATE TABLE LastName (lastname nvarchar ( 50 ) not null )
INSERT into FirstName values ( ' Jack ' )
INSERT into FirstName values ( ' Jill ' )
INSERT into FirstName values ( ' Tom ' )
INSERT into FirstName values ( ' Dick ' )
INSERT into FirstName values ( ' Harry ' )
INSERT into FirstName values ( ' Robert ' )
INSERT into FirstName values ( ' Peter ' )
INSERT into FirstName values ( ' David ' )
INSERT into FirstName values ( ' Susan ' )
INSERT into FirstName values ( ' Mary ' )
INSERT into MiddleName values ( ' A ' )
INSERT into MiddleName values ( ' B ' )
INSERT into MiddleName values ( ' C ' )
INSERT into MiddleName values ( ' D ' )
INSERT into MiddleName values ( ' E ' )
INSERT into MiddleName values ( ' F ' )
INSERT into MiddleName values ( ' G ' )
INSERT into MiddleName values ( ' H ' )
INSERT into MiddleName values ( ' I ' )
INSERT into MiddleName values ( ' J ' )
INSERT into LastName values ( ' Smith ' )
INSERT into LastName values ( ' Lamb ' )
INSERT into LastName values ( ' Ron ' )
INSERT into LastName values ( ' Peterson ' )
INSERT into LastName values ( ' Paul ' )
INSERT into LastName values ( ' Black ' )
INSERT into LastName values ( ' Brown ' )
INSERT into LastName values ( ' Adams ' )
INSERT into LastName values ( ' Diaz ' )
INSERT into LastName values ( ' Hall ' )
-- -----使用UNION
use demo
create table A ( val int );
create table B ( val int );
insert into A values ( 1 );
insert into A values ( 2 );
insert into A values ( 2 );
insert into A values ( 3 );
insert into A values ( 4 );
insert into B values ( 2 );
insert into B values ( 4 );
insert into B values ( 6 );
insert into B values ( 6 );
insert into B values ( 7 );
select * from Employee
select * from Dept
-- ------------------inner join------------------------
select *
from Employee e
inner join Dept d on e.DeptCode = d.deptcode
select *
from Employee e
join Dept d on e.DeptCode = d.deptcode
select *
from Employee e , Dept d where e.DeptCode = d.deptcode
-- --------------left join----------------------------
select *
from Employee e
left join Dept d on e.DeptCode = d.deptcode
-- --------------right join----------------------------
select *
from Employee e
right join Dept d on e.DeptCode = d.deptcode
-- left join equal to right join
select e.userId,e.deptcode,e.salary,d.deptcode,d.deptname
from Dept d
right join Employee e on e.DeptCode = d.deptcode
except -- --------what's union?
select e.userId,e.deptcode,e.salary,d.deptcode,d.deptname
from Employee e
left join Dept d on e.DeptCode = d.deptcode
-- -------------------cross join-----------------------
select *
from FirstName
cross join Middlename
cross join lastname
-- ---------------------------Multitable join---------------
use AdventureWorks
select *
from Purchasing.Vendor v
inner join Purchasing.ProductVendor pv on v. VendorID = pv. VendorID
inner join Production.Product p on p.ProductID = pv.ProductID
-- -------------------join self----------------------------------
select e.EmployeeID,e.LoginID,e.ManagerID,f.LoginID
from HumanResources.Employee e
left join HumanResources.Employee f on e.ManagerID = f.EmployeeID
select e.ProductID,e.ListPrice,f.ProductID,f.ListPrice
from Production.Product e
join Production.Product f on e.ListPrice < f.ListPrice
order by e.ProductID
select a, count (c)
from
(
select e.ProductID a,e.ListPrice b ,f.ProductID c ,f.ListPrice d
from Production.Product e
join Production.Product f on e.ListPrice < f.ListPrice
) as haha
group by a
-- -------------------union ----------------------------------------
-- ---------可以用group by在子句里,但是不能用order bY 在子句里
-- --------order by 只能在所有子句的外面最后使用
use Demo
drop table A,B
select * from A
union
select * from B
select * from A
union all
select * from B
select * from A
union all
select * from B
order by val
select * from A
except
select * from B
order by val
select * from A
intersect
select * from B
order by val
select top 2 * from Employee
select top 10 percent * from Employee
declare @i int
set @i = 50
select top ( @i ) percent * from Employee
select [ Name ]
from Production.Product
where ListPrice >
(
select avg ( ListPrice) from Production.Product
)
select *
from Production.Product prod
where ProductModelID in
(
select ProductModelID from Production.ProductModel where Name like ' Road% '
)
select tmp.Name,prod.ProductID
from Production.Product prod,
(
select ProductModelID,Name from Production.ProductModel where Name like ' Road% '
) tmp
where tmp.ProductModelID = prod.ProductModelID
except
select tmp.Name,prod.ProductID
from Production.Product prod
join Production.ProductModel tmp
on tmp.ProductModelID = prod.ProductModelID and tmp.Name like ' Road% '
-
-- -----all
-- --------some|any
-- -----------------不允许在子查询中使用order by子句,但是,如果top子句被指定的话,这是可以使用order by 子句的
select * from Production.Product
Where ProductModelID in
(
select top 10 ProductModelID from Production.ProductModel
where Name like ' Road% '
order by ProductModelID
)
-- --------------------不允许在子查询中使用Computer子句
-- --------------------text ,ntext ,image 大对象是不能放进子查询里的
-- on same Table
select distinct ProductID,OrderQty
from Sales.SalesOrderDetail as sod_outer
where OrderQty =
(
select Max (OrderQty)
from Sales.SalesOrderDetail as sod_inner
where sod_outer.ProductID = sod_inner.ProductID
)
-- except
select ProductID, Max (OrderQty) as OrderQty
from Sales.SalesOrderDetail
group by ProductID
select distinct ProductID, Max (OrderQty) as OrderQty
from Sales.SalesOrderDetail
group by ProductID
select SalesOrderID,ProductID,OrderQty
from Sales.SalesOrderDetail as sod_outer
where OrderQty >=
(
select avg (OrderQty) * 10
from Sales.SalesOrderDetail as sod_inner
where sod_outer.ProductID = sod_inner.ProductID
)
-- --difference table
select * from Sales.SalesPerson
select * from Sales.SalesOrderHeader
select ss_outer.SalesPersonID
from Sales.SalesPerson as ss_outer
where 2000 <=
(
select ss_outer.CommissionPct * ss_inner.TotalDue)
from Sales.SalesOrderHeader as ss_inner
where ss_outer.SalesPersonID = ss_inner.SalesPersonID
)
select ss_outer.SalesPersonID
from Sales.SalesPerson as ss_outer
where 2000 <=
(
select max (ss_inner.TotalDue) * ss_outer.CommissionPct
from Sales.SalesOrderHeader as ss_inner
where ss_outer.SalesPersonID = ss_inner.SalesPersonID
)
order by ss_outer.SalesPersonID
select SalesPersonID
from Sales.SalesPerson
group by SalesPersonID
having SalesPersonID = 288
select * from Production.Product
select * from Production.ProductInventory
-- --在exists后面可以直接用*来代替列名是可以的,因为它并不真的取值出来
select distinct ProductID,Name
from Production.Product pr
where exists
( select * from Production.ProductInventory inv
where pr.ProductID = inv.ProductID and Quantity > 500
)
except
select pr.ProductID,pr.Name
from Production.Product pr
join Production.ProductInventory inv on pr.ProductID = inv.ProductID and Quantity > 500
select * from Production.Product
where ProductModelID in
(
select ProductModelID from Production.ProductModel where Name like ' Road% '
)
except
select * from Production.Product pp
where Exists
(
select ProductModelID from Production.ProductModel ppm where ppm.Name like ' Road% ' and pp.ProductModelID = ppm.ProductModelID
)
with TopSales(SalespersonID,NumSales) as
(
select SalesPersonID, Count ( * )
from Sales.SalesOrderHeader
Group BY SalesPersonID
)
select top ( 5 ) * from TopSales where SalespersonID is not null
order by NumSales desc
use demo
with Emp as
(
select * from Employee where deptCode = ' rd '
),
Dep as
(
select * from Dept
)
select * from Emp,Dep where Emp.DeptCode = dep.DeptCode]]]
first test
with Managers as
(
select EmployeeID,LoginID,Title,ManagerID
From HumanResources.Employee
where EmployeeID = 107
union all
Select e.EmployeeID,e.LoginID,e.Title,e.ManagerID
From HumanResources.Employee e
inner join Managers mgr
on e.EmployeeID = mgr.ManagerID
)
select * From Managers
option (maxrecursion 2 )
USE [ Demo ]
GO
/**/ /****** Object: Table [dbo].[EmpSalary] Script Date: 07/19/2006 10:17:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [ dbo ] . [ EmpSalary ] (
[ UserID ] [ varchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ DeptCode ] [ varchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ Salary ] [ float ] NULL ,
PRIMARY KEY CLUSTERED
(
[ UserID ] ASC
) WITH (IGNORE_DUP_KEY = OFF ) ON [ PRIMARY ]
) ON [ PRIMARY ]
GO
SET ANSI_PADDING OFF
---------------------
day
5
------------------------------------------------
begin tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test1 ' , ' rd ' , 100 )
insert into Employee(UserID,DeptCode,Salary)Values( ' test2 ' , ' rd ' , 100 )
rollback tran MyTran
commit tran MyTran
exec SP_LOCK
select * from Employee -- 在另一个会话中取不到数据
select * from Employee with(nolock) -- 取到数据,包括未提交的已被修改的数据,因此该数据可能为脏
select * from Employee with(readpast) -- 取到数据,但是不包括未提交的数据
--- 演示如何使用save tran
begin tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test4 ' , ' rd ' , 100 )
save tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test5 ' , ' rd ' , 100 )
rollback tran MyTran ------------- 第一次回滚倒最近记录点
rollback tran MyTran ------------- 第二次回滚也是滚到最近记录点(本例子只能一个记录点 所以回滚到开头)
commit tran MyTran
begin tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test4 ' , ' rd ' , 100 )
save tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test5 ' , ' rd ' , 100 )
save tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test3 ' , ' rd ' , 100 )
rollback tran MyTran ------------- 第一次回滚倒最近记录点
rollback tran MyTran ------------- 第二次回滚也是滚到最近记录点(本例子只能一个记录点 所以回滚到开头)
rollback tran MyTran
commit tran MyTran
delete from Employee where UserID in ( ' test1 ' , ' test4 ' , ' test2 ' , ' test5 ' , ' test3 ' )
select @@trancount ---------- 事务的嵌套层数
---------------------- 演示嵌套事务
begin tran MyTran_out
select @@trancount
insert into Employee(UserID,DeptCode,Salary)Values( ' test4 ' , ' rd ' , 100 )
select @@trancount
begin tran MyTran_Inner
select @@trancount
insert into Employee(UserID,DeptCode,Salary)Values( ' test5 ' , ' rd ' , 100 )
select @@trancount
commit tran MyTran_inner
select @@trancount
rollback tran
select @@trancount
-- 外层回滚,全部回滚,而且不能单独回滚内部事务 ---
commit tran MyTran
-- 名字将被忽略
rollback tran MyTran_out
--- 可以证明:事务回滚是先回到记录点
--------------- 插入一行记录到表中
select * from Employee
begin tran
insert into Employee (UserID,DeptCode,Salary)
output Inserted.UserID,Inserted.DeptCode,Inserted.Salary
Values( ' test2 ' , ' rd ' , 100 )
rollback tran
delete from Employee where UserID = ' test2 '
-- select into 会创建一个新的表,如果该表已存在,会抱错
select UserID,DeptCode,Salary into #temp from Employee
select * from #temp
---------- insert into / output into 不会创建新表,而是使用已经存在的表
insert into #temp
select UserID ,DeptCode,Salary
From Employee
select * from #temp
drop table #temp
create Proc sp_get
as select UserID,DeptCode,Salary
From Employee
insert into #temp
exec sp_get
create table Demo1
(
id int identity( 1 , 1 ) primary key,
val int ,
result as (abs(val))
)
insert into Demo1
output Inserted.id,Inserted.val,Inserted.result
values( - 23 )
-------------- output 可以用来返回由数据库自己维护的字段的值,该值并不由应用程序维护,所以最好在output中输出
insert into Demo1
output Inserted.id,Inserted.val,Inserted.result
select * from(select 20 as val union select 30 as result)
exec sp_lock
------------ delete 会做日志,而Truncate不会,因而比较快
select * from Sales.SalesPersonQuotaHistory
select * from Sales.SalesPerson
Begin Tran
delete Sales.SalesPersonQuotaHistory
from Sales.SalesPersonQuotaHistory ----------- attention:如果删除的时候涉及到连接多表,则必须先指定删除哪张表,可以是别名
join Sales.SalesPerson on Sales.SalesPersonQuotaHistory.SalesPersonID = Sales.SalesPerson.SalesPersonID
and Sales.SalesPerson.SalesYTD > 2500000
rollback Tran
----------------- update ---------------------------------
use Demo
update Employee
set Salary = 200 ,DeptCode = ' mgr '
output Deleted.Salary,Inserted.Salary
where UserID = ' qiuwh '
select * from Production.Product
select * from Purchasing.ProductVendor
Begin Tran
Update Production.Product
set ListPrice = 2 * ListPrice,Name = ' BingoSoft '
where ProductID in
(select ProductID from Purchasing.ProductVendor where VendorID = 5 )
rollback Tran
Begin Tran
Update Production.Product
set ListPrice = 2 * ListPrice
from Production.Product join Purchasing.ProductVendor PPV on PPV.ProductID = Production.Product .ProductID and PPV.VendorID = 5
Rollback Tran
怎样修改表?!!!!!!!!!!!!!!
Log表?
类别(修改)
Create Table Mahui
(
ID int identity not null ,
Salary int Null
)
insert into Mahui values( 1 )
insert into Mahui values( 2 )
insert into Mahui values( 3 )
insert into Mahui values( null )
insert into Mahui values( null )
insert into Mahui values( null )
select * from Mahui
select Sum(Salary) from Mahui
Drop table LogEmployee
Create Table LogEmployee
(
Opration varchar( 20 ) not null ,
Description Varchar( 100 ),
OccurTime DateTime,
)
drop Trigger Trg_Insert_Employee
Create Trigger Trg_Insert_Employee
on dbo.Employee
for insert
as
declare @Descrip varchar( 50 )
declare @UserID varchar ( 50 )
declare @DeptCode varchar ( 50 )
declare @Salary int
declare @Sa varchar ( 20 )
set @UserID = (select Inserted.UserID from inserted)
set @DeptCode = (select Inserted.DeptCode from inserted)
set @Salary = (select Inserted.Salary from inserted)
set @Sa = Convert(varchar( 20 ),@Salary)
set @Descrip = ' UserID: ' + @UserID + ' ; '' Deptcode: ' + @DeptCode + ' ; ' + ' Salary: ' + @Sa
insert into LogEmployee(Opration,Description,OccurTime)values( ' 插入 ' ,@Descrip,GetDate())
drop Trigger Trg_Delete_Employee
Create Trigger Trg_Delete_Employee
on dbo.Employee
for delete
as
declare @Descrip varchar( 50 )
declare @UserID varchar ( 50 )
declare @DeptCode varchar ( 50 )
declare @Salary int
declare @Sa varchar ( 20 )
set @UserID = (select deleted.UserID from deleted)
set @DeptCode = (select deleted.DeptCode from deleted)
set @Salary = (select deleted.Salary from deleted)
set @Sa = Convert(varchar( 20 ),@Salary)
set @Descrip = ' UserID: ' + @UserID + ' ; ' + ' Deptcode: ' + @DeptCode + ' ; ' + ' Salary: ' + @Sa
insert into LogEmployee(Opration,Description,OccurTime)values( ' 删除 ' ,@Descrip,GetDate())
drop Trigger Trg_Update_Employee
Create Trigger Trg_Update_Employee
on dbo.Employee
for Update
as
declare @Descrip varchar( 50 )
declare @UserIDOld varchar ( 50 )
declare @DeptCodeOld varchar ( 50 )
declare @SalaryOld int
declare @SaOld varchar ( 20 )
set @UserIDOld = (select Inserted.UserID from inserted)
set @DeptCodeOld = (select Inserted.DeptCode from inserted)
set @SalaryOld = (select Inserted.Salary from inserted)
set @SaOld = Convert(varchar( 20 ),@SalaryOld)
declare @UserIDNew varchar ( 50 )
declare @DeptCodeNew varchar ( 50 )
declare @SalaryNew int
declare @SaNew varchar ( 20 )
set @UserIDNew = (select deleted.UserID from deleted)
set @DeptCodeNew = (select deleted.DeptCode from deleted)
set @SalaryNew = (select deleted.Salary from deleted)
set @SaNew = Convert(varchar( 20 ),@SalaryNew)
set @Descrip = ' UserID: ' + @UserIDNew + ' --> ' + @UserIDOld + ' ; ' + ' Deptcode: ' + @DeptCodeNew + ' --> ' + @DeptCodeOld + ' ; ' + ' Salary: ' + @SaNew + ' --> ' + @SaOld
insert into LogEmployee(Opration,Description,OccurTime)values( ' 更新 ' ,@Descrip,GetDate())
select * from Employee
insert into Employee(UserID,DeptCode,Salary)values( ' 11111 ' , ' dev1 ' , ' 200 ' )
update Employee
set UserID = ' mimi ' ,DeptCode = ' dev1 ' ,Salary = ' 12 '
where UserID = 33333
select * from Employee where UserID = 11111
delete from Employee where UserID = ' 11111 '
select * from LogEmployee
Create Trigger Trg_Insert_Update_Delete_Employee
on dbo.Employee
for insert,update,delete
as
if insert(Opration)
Begin
insert into MyLog(Opration,Description)( ' 插入 ' ,inserted.UserID + inserted.Deptcode + inserted.Salary,GetDate())
End
if Update(any)
Begin
insert into MyLog(Opration,NewValue1,NewValue2,NewValue3)( ' 修改 ' ,deleted.UserID,inserted.UserID,deleted.Deptcode,inserted.Deptcode,deleted.Salary,inserted.Salary)
End
if Delete(Opration)
Begin
insert into MyLog(Opration,OldValue1,OldValue2,OldValue3)( ' 删除 ' ,deleted.UserID,deleted.Deptcode,deleted.Salary)
End
begin tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test1 ' , ' rd ' , 100 )
insert into Employee(UserID,DeptCode,Salary)Values( ' test2 ' , ' rd ' , 100 )
rollback tran MyTran
commit tran MyTran
exec SP_LOCK
select * from Employee -- 在另一个会话中取不到数据
select * from Employee with(nolock) -- 取到数据,包括未提交的已被修改的数据,因此该数据可能为脏
select * from Employee with(readpast) -- 取到数据,但是不包括未提交的数据
--- 演示如何使用save tran
begin tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test4 ' , ' rd ' , 100 )
save tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test5 ' , ' rd ' , 100 )
rollback tran MyTran ------------- 第一次回滚倒最近记录点
rollback tran MyTran ------------- 第二次回滚也是滚到最近记录点(本例子只能一个记录点 所以回滚到开头)
commit tran MyTran
begin tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test4 ' , ' rd ' , 100 )
save tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test5 ' , ' rd ' , 100 )
save tran MyTran
insert into Employee(UserID,DeptCode,Salary)Values( ' test3 ' , ' rd ' , 100 )
rollback tran MyTran ------------- 第一次回滚倒最近记录点
rollback tran MyTran ------------- 第二次回滚也是滚到最近记录点(本例子只能一个记录点 所以回滚到开头)
rollback tran MyTran
commit tran MyTran
delete from Employee where UserID in ( ' test1 ' , ' test4 ' , ' test2 ' , ' test5 ' , ' test3 ' )
select @@trancount ---------- 事务的嵌套层数
---------------------- 演示嵌套事务
begin tran MyTran_out
select @@trancount
insert into Employee(UserID,DeptCode,Salary)Values( ' test4 ' , ' rd ' , 100 )
select @@trancount
begin tran MyTran_Inner
select @@trancount
insert into Employee(UserID,DeptCode,Salary)Values( ' test5 ' , ' rd ' , 100 )
select @@trancount
commit tran MyTran_inner
select @@trancount
rollback tran
select @@trancount
-- 外层回滚,全部回滚,而且不能单独回滚内部事务 ---
commit tran MyTran
-- 名字将被忽略
rollback tran MyTran_out
--- 可以证明:事务回滚是先回到记录点
--------------- 插入一行记录到表中
select * from Employee
begin tran
insert into Employee (UserID,DeptCode,Salary)
output Inserted.UserID,Inserted.DeptCode,Inserted.Salary
Values( ' test2 ' , ' rd ' , 100 )
rollback tran
delete from Employee where UserID = ' test2 '
-- select into 会创建一个新的表,如果该表已存在,会抱错
select UserID,DeptCode,Salary into #temp from Employee
select * from #temp
---------- insert into / output into 不会创建新表,而是使用已经存在的表
insert into #temp
select UserID ,DeptCode,Salary
From Employee
select * from #temp
drop table #temp
create Proc sp_get
as select UserID,DeptCode,Salary
From Employee
insert into #temp
exec sp_get
create table Demo1
(
id int identity( 1 , 1 ) primary key,
val int ,
result as (abs(val))
)
insert into Demo1
output Inserted.id,Inserted.val,Inserted.result
values( - 23 )
-------------- output 可以用来返回由数据库自己维护的字段的值,该值并不由应用程序维护,所以最好在output中输出
insert into Demo1
output Inserted.id,Inserted.val,Inserted.result
select * from(select 20 as val union select 30 as result)
exec sp_lock
------------ delete 会做日志,而Truncate不会,因而比较快
select * from Sales.SalesPersonQuotaHistory
select * from Sales.SalesPerson
Begin Tran
delete Sales.SalesPersonQuotaHistory
from Sales.SalesPersonQuotaHistory ----------- attention:如果删除的时候涉及到连接多表,则必须先指定删除哪张表,可以是别名
join Sales.SalesPerson on Sales.SalesPersonQuotaHistory.SalesPersonID = Sales.SalesPerson.SalesPersonID
and Sales.SalesPerson.SalesYTD > 2500000
rollback Tran
----------------- update ---------------------------------
use Demo
update Employee
set Salary = 200 ,DeptCode = ' mgr '
output Deleted.Salary,Inserted.Salary
where UserID = ' qiuwh '
select * from Production.Product
select * from Purchasing.ProductVendor
Begin Tran
Update Production.Product
set ListPrice = 2 * ListPrice,Name = ' BingoSoft '
where ProductID in
(select ProductID from Purchasing.ProductVendor where VendorID = 5 )
rollback Tran
Begin Tran
Update Production.Product
set ListPrice = 2 * ListPrice
from Production.Product join Purchasing.ProductVendor PPV on PPV.ProductID = Production.Product .ProductID and PPV.VendorID = 5
Rollback Tran
怎样修改表?!!!!!!!!!!!!!!
Log表?
类别(修改)
Create Table Mahui
(
ID int identity not null ,
Salary int Null
)
insert into Mahui values( 1 )
insert into Mahui values( 2 )
insert into Mahui values( 3 )
insert into Mahui values( null )
insert into Mahui values( null )
insert into Mahui values( null )
select * from Mahui
select Sum(Salary) from Mahui
Drop table LogEmployee
Create Table LogEmployee
(
Opration varchar( 20 ) not null ,
Description Varchar( 100 ),
OccurTime DateTime,
)
drop Trigger Trg_Insert_Employee
Create Trigger Trg_Insert_Employee
on dbo.Employee
for insert
as
declare @Descrip varchar( 50 )
declare @UserID varchar ( 50 )
declare @DeptCode varchar ( 50 )
declare @Salary int
declare @Sa varchar ( 20 )
set @UserID = (select Inserted.UserID from inserted)
set @DeptCode = (select Inserted.DeptCode from inserted)
set @Salary = (select Inserted.Salary from inserted)
set @Sa = Convert(varchar( 20 ),@Salary)
set @Descrip = ' UserID: ' + @UserID + ' ; '' Deptcode: ' + @DeptCode + ' ; ' + ' Salary: ' + @Sa
insert into LogEmployee(Opration,Description,OccurTime)values( ' 插入 ' ,@Descrip,GetDate())
drop Trigger Trg_Delete_Employee
Create Trigger Trg_Delete_Employee
on dbo.Employee
for delete
as
declare @Descrip varchar( 50 )
declare @UserID varchar ( 50 )
declare @DeptCode varchar ( 50 )
declare @Salary int
declare @Sa varchar ( 20 )
set @UserID = (select deleted.UserID from deleted)
set @DeptCode = (select deleted.DeptCode from deleted)
set @Salary = (select deleted.Salary from deleted)
set @Sa = Convert(varchar( 20 ),@Salary)
set @Descrip = ' UserID: ' + @UserID + ' ; ' + ' Deptcode: ' + @DeptCode + ' ; ' + ' Salary: ' + @Sa
insert into LogEmployee(Opration,Description,OccurTime)values( ' 删除 ' ,@Descrip,GetDate())
drop Trigger Trg_Update_Employee
Create Trigger Trg_Update_Employee
on dbo.Employee
for Update
as
declare @Descrip varchar( 50 )
declare @UserIDOld varchar ( 50 )
declare @DeptCodeOld varchar ( 50 )
declare @SalaryOld int
declare @SaOld varchar ( 20 )
set @UserIDOld = (select Inserted.UserID from inserted)
set @DeptCodeOld = (select Inserted.DeptCode from inserted)
set @SalaryOld = (select Inserted.Salary from inserted)
set @SaOld = Convert(varchar( 20 ),@SalaryOld)
declare @UserIDNew varchar ( 50 )
declare @DeptCodeNew varchar ( 50 )
declare @SalaryNew int
declare @SaNew varchar ( 20 )
set @UserIDNew = (select deleted.UserID from deleted)
set @DeptCodeNew = (select deleted.DeptCode from deleted)
set @SalaryNew = (select deleted.Salary from deleted)
set @SaNew = Convert(varchar( 20 ),@SalaryNew)
set @Descrip = ' UserID: ' + @UserIDNew + ' --> ' + @UserIDOld + ' ; ' + ' Deptcode: ' + @DeptCodeNew + ' --> ' + @DeptCodeOld + ' ; ' + ' Salary: ' + @SaNew + ' --> ' + @SaOld
insert into LogEmployee(Opration,Description,OccurTime)values( ' 更新 ' ,@Descrip,GetDate())
select * from Employee
insert into Employee(UserID,DeptCode,Salary)values( ' 11111 ' , ' dev1 ' , ' 200 ' )
update Employee
set UserID = ' mimi ' ,DeptCode = ' dev1 ' ,Salary = ' 12 '
where UserID = 33333
select * from Employee where UserID = 11111
delete from Employee where UserID = ' 11111 '
select * from LogEmployee
Create Trigger Trg_Insert_Update_Delete_Employee
on dbo.Employee
for insert,update,delete
as
if insert(Opration)
Begin
insert into MyLog(Opration,Description)( ' 插入 ' ,inserted.UserID + inserted.Deptcode + inserted.Salary,GetDate())
End
if Update(any)
Begin
insert into MyLog(Opration,NewValue1,NewValue2,NewValue3)( ' 修改 ' ,deleted.UserID,inserted.UserID,deleted.Deptcode,inserted.Deptcode,deleted.Salary,inserted.Salary)
End
if Delete(Opration)
Begin
insert into MyLog(Opration,OldValue1,OldValue2,OldValue3)( ' 删除 ' ,deleted.UserID,deleted.Deptcode,deleted.Salary)
End