SQL Server 返回最后插入記錄的自動編號ID


轉自http://blog.163.com/sdq_1314/blog/static/16690825420106268545147/

SQL Server 返回最后插入記錄的自動編號ID

最近在開發項目的過程中遇到這么一個問題,就是在插入一條記錄的后立即獲取其在數據庫中自增的ID,以便處理相關聯的數據,怎么做?在sql server 2000中可以這樣做,有幾種方式。詳細請看下面的講解與對比。

一、要獲取此ID,最簡單的方法就是:(以下舉一簡單實用的例子)

--創建數據庫和表
create database MyDataBase
use MyDataBase
create table mytable
(
id int identity(1,1),
name varchar(20)
)
--執行這個SQL,就能查出來剛插入記錄對應的自增列的值
insert into mytable values('李四')
select @@identity

二、三種方式的比較

SQL Server 2000中,有三個比較類似的功能:他們分別是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它們都返回插入到 IDENTITY 列中的值。
IDENT_CURRENT 返回為任何會話和任何作用域中的特定表最后生成的標識值。IDENT_CURRENT 不受作用域和會話的限制,而受限於指定的表。IDENT_CURRENT 返回為任何會話和作用域中的特定表所生成的值。
@@IDENTITY 返回為當前會話的所有作用域中的任何表最后生成的標識值。
SCOPE_IDENTITY 返回為當前會話和當前作用域中的任何表最后生成的標識值
SCOPE_IDENTITY 和 @@IDENTITY 返回在當前會話中的任何表內所生成的最后一個標識值。但是,SCOPE_IDENTITY 只返回插入到當前作用域中的值;@@IDENTITY 不受限於特定的作用域。

例如,有兩個表 T1 和 T2,在 T1 上定義了一個 INSERT 觸發器。當將某行插入 T1 時,觸發器被激發,並在 T2 中插入一行。此例說明了兩個作用域:一個是在 T1 上的插入,另一個是作為觸發器的結果在 T2 上的插入。

假設 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 將在 T1 上的 INSERT 語句的最后返回不同的值。

@@IDENTITY 返回插入到當前會話中任何作用域內的最后一個 IDENTITY 列值,該值是插入 T2 中的值。

SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,該值是發生在相同作用域中的最后一個 INSERT。如果在作用域中發生插入語句到標識列之前喚醒調用 SCOPE_IDENTITY() 函數,則該函數將返回 NULL 值。

而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分別是這兩個表最后自增的值。
ajqc的實驗:(40條本地線程,40+40條遠程線程同時並發測試,插入1200W行),得出的結論是:
1.在典型的級聯應用中.不能用@@IDENTITY,在CII850,256M SD的機器上1W多行時就會並發沖突.在P42.8C,512M DDR上,才6000多行時就並發沖突.
2.SCOPE_IDENTITY()是絕對可靠的,可以用在存儲過程中,連觸發器也不用建,沒並發沖突
SELECT   IDENT_CURRENT('TableName')   --返回指定表中生成的最后一個標示值   
SELECT   IDENT_INCR('TableName')--返回指定表的標示字段增量值
SELECT   IDENT_SEED('TableName')--返回指定表的標示字段種子值

返回最后插入記錄的自動編號
SELECT IDENT_CURRENT('TableName')
返回下一個自動編號:   
SELECT   IDENT_CURRENT('TableName')   +   (SELECT   IDENT_INCR('TableName'))
SELECT @@IDENTITY --返回當前會話所有表中生成的最后一個標示值
geovindu
2009-1-8 12:18:54
0.把長日期轉換為短日期   Convert(char(10),getdate(),120) 
    1.按姓氏筆畫排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 
2.數據庫加密:
select encrypt('原始密碼')
select pwdencrypt('原始密碼')
select pwdcompare('原始密碼','加密后密碼') = 1--相同;否則不相同 encrypt('原始密碼')
select pwdencrypt('原始密碼')
select pwdcompare('原始密碼','加密后密碼') = 1--相同;否則不相同
3.取回表中字段:
declare @list varchar(1000),@sql nvarchar(1000) 
select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
set @sql='select '+right(@list,len(@list)-1)+' from 表A' 
exec (@sql)
4.查看硬盤分區:
EXEC master..xp_fixeddrives
5.比較A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
=
(select checksum_agg(binary_checksum(*)) from B)
print '相等'
else
print '不相等'
6.殺掉所有的事件探察器進程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
EXEC sp_msforeach_worker '?'
7.記錄搜索:
開頭到N條記錄
Select Top N * From 表
-------------------------------
N到M條記錄(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
----------------------------------
N到結尾記錄
Select Top N * From 表 Order by ID Desc
8.如何修改數據庫的名稱:
sp_renamedb 'old_name', 'new_name' 
9:獲取當前數據庫中的所有用戶表
select Name from sysobjects where xtype='u' and status>=0
10:獲取某一個表的所有字段
select name from syscolumns where id=object_id('表名')
11:查看與某一個表相關的視圖、存儲過程、函數
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'
12:查看當前數據庫中所有存儲過程
select name as 存儲過程名稱 from sysobjects where xtype='P'
13:查詢用戶創建的所有數據庫
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
14:查詢某一個表的字段和數據類型
select column_name,data_type from information_schema.columns
where table_name = '表名' 
[n].[標題]:
Select * From TableName Order By CustomerName 
[n].[標題]:
來自 http://dev.csdn.net/develop/article/83/83138.shtm

一、 只復制一個表結構,不復制數據

 select top 0 * into [t1] from [t2]

二、 獲取數據庫中某個對象的創建腳本

1、 先用下面的腳本創建一個函數

<div><div> if exists(select 1 from sysobjects where id=object_id('fgetscript') and objectproperty(id,'IsInlineFunction')=0)
 drop function fgetscript
go

create function fgetscript(
 @servername varchar(50)     --服務器名
 ,@userid varchar(50)='sa'    --用戶名,如果為nt驗證方式,則為空
 ,@password varchar(50)=''    --密碼
 ,@databasename varchar(50)    --數據庫名稱
 ,@objectname varchar(250)    --對象名

) returns varchar(8000)
as
begin
 declare @re varchar(8000)        --返回腳本
 declare @srvid int,@dbsid int       --定義服務器、數據庫集id
 declare @dbid int,@tbid int        --數據庫、表id
 declare @err int,@src varchar(255), @desc varchar(255) --錯誤處理變量

--創建sqldmo對象
 exec @err=sp_oacreate 'sqldmo.sqlserver',@srvid output
 if @err<>0 goto lberr

--連接服務器
 if isnull(@userid,'')='' --如果是 Nt驗證方式
 begin
  exec @err=sp_oasetproperty @srvid,'loginsecure',1
  if @err<>0 goto lberr

  exec @err=sp_oamethod @srvid,'connect',null,@servername
 end
 else
  exec @err=sp_oamethod @srvid,'connect',null,@servername,@userid,@password

 if @err<>0 goto lberr

--獲取數據庫集
 exec @err=sp_oagetproperty @srvid,'databases',@dbsid output
 if @err<>0 goto lberr

--獲取要取得腳本的數據庫id
 exec @err=sp_oamethod @dbsid,'item',@dbid output,@databasename
 if @err<>0 goto lberr

--獲取要取得腳本的對象id
 exec @err=sp_oamethod @dbid,'getobjectbyname',@tbid output,@objectname
 if @err<>0 goto lberr

--取得腳本
 exec @err=sp_oamethod @tbid,'script',@re output
 if @err<>0 goto lberr

 --print @re
 return(@re)

lberr:
 exec sp_oageterrorinfo NULL, @src out, @desc out 
 declare @errb varbinary(4)
 set @errb=cast(@err as varbinary(4))
 exec master..xp_varbintohexstr @errb,@re out
 set @re='錯誤號: '+@re
   +char(13)+'錯誤源: '+@src
   +char(13)+'錯誤描述: '+@desc
 return(@re)
end
go

</div></div>

2、 用法如下
用法如下,

<div><div> print dbo.fgetscript('服務器名','用戶名','密碼','數據庫名','表名或其它對象名')
</div></div>

3、 如果要獲取庫里所有對象的腳本,如如下方式

<div><div> declare @name varchar(250)
declare #aa cursor for
 select name from sysobjects where xtype not in('S','PK','D','X','L')
open #aa
fetch next from #aa into @name
while @@fetch_status=0
begin
 print dbo.fgetscript('onlytiancai','sa','sa','database',@name)
 fetch next from #aa into @name
end
close #aa
deallocate #aa
</div></div>

4、 聲明,此函數是csdn鄒建鄒老大提供的
三、 分隔字符串
如果有一個用逗號分割開的字符串,比如說"a,b,c,d,1,2,3,4",如何用t-sql獲取這個字符串有幾個元素,獲取第幾個元素的值是多少呢?因為t-sql里沒有split函數,也沒有數組的概念,所以只能自己寫幾個函數了。
1、 獲取元素個數的函數

<div><div> create function getstrarrlength (@str varchar(8000))
returns int
as
begin
  declare @int_return int
  declare @start int
  declare @next int
  declare @location int
  select @str =','+ @str +','
  select @str=replace(@str,',,',',')
  select @start =1
  select @next =1 
  select @location = charindex(',',@str,@start)
  while (@location <>0)
  begin
    select @start = @location +1
    select @location = charindex(',',@str,@start)
    select @next =@next +1
  end
 select @int_return = @next-2
 return @int_return
end
</div></div>

2、 獲取指定索引的值的函數

<div><div> create function getstrofindex (@str varchar(8000),@index int =0)
returns varchar(8000)
as
begin
  declare @str_return varchar(8000)
  declare @start int
  declare @next int
  declare @location int
  select @start =1
  select @next =1 --如果習慣從0開始則select @next =0
  select @location = charindex(',',@str,@start)
  while (@location <>0 and @index > @next )
  begin
    select @start = @location +1
    select @location = charindex(',',@str,@start)
    select @next =@next +1
  end
  if @location =0 select @location =len(@str)+1 --如果是因為沒有逗號退出,則認為逗號在字符串后
  select @str_return = substring(@str,@start,@location -@start) --@start肯定是逗號之后的位置或者就是初始值1
  if (@index <> @next ) select @str_return = '' --如果二者不相等,則是因為逗號太少,或者@index小於@next的初始值1。
  return @str_return
end
</div></div>

3、 測試

<div><div> SELECT [dbo].[getstrarrlength]('1,2,3,4,a,b,c,d')
SELECT [dbo].[getstrofindex]('1,2,3,4,a,b,c,d',5)
</div></div>

四、 一條語句執行跨越若干個數據庫
我要在一條語句里操作不同的服務器上的不同的數據庫里的不同的表,怎么辦呢?
第一種方法:

<div><div> select * from OPENDATASOURCE('SQLOLEDB','Data Source=遠程ip;User ID=sa;Password=密碼').庫名.dbo.表名
</div></div>

第二種方法:
先使用聯結服務器:

<div><div> EXEC sp_addlinkedserver '別名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=遠程名;UID=用戶;PWD=密碼;'
exec sp_addlinkedsrvlogin  @rmtsrvname='別名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密碼'
GO
</div></div>

然后你就可以如下:

<div><div> select * from 別名.庫名.dbo.表名
insert 庫名.dbo.表名 select * from 別名.庫名.dbo.表名
select * into 庫名.dbo.新表名 from 別名.庫名.dbo.表名
go
</div></div>

五、 怎樣獲取一個表中所有的字段信息
蛙蛙推薦:怎樣獲取一個表中所有字段的信息
先創建一個視圖

<div><div> Create view fielddesc    
as
select o.name as table_name,c.name as field_name,t.name as type,c.length as 

length,c.isnullable as isnullable,convert(varchar(30),p.value) as desp 
from syscolumns c  
join systypes t on c.xtype = t.xusertype
join sysobjects o on o.id=c.id 
left join    sysproperties p on p.smallid=c.colid and p.id=o.id    
where o.xtype='U'

</div></div>

查詢時:

<div><div> Select * from fielddesc where table_name = '你的表名'</div></div>

 

還有個更強的語句,是鄒建寫的,也寫出來吧

<div><div> SELECT 
 (case when a.colorder=1 then d.name else '' end) N'表名',
 a.colorder N'字段序號',
 a.name N'字段名',
 (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) N'標識',
 (case when (SELECT count(*)
 FROM sysobjects
 WHERE (name in
           (SELECT name
          FROM sysindexes
          WHERE (id = a.id) AND (indid in
                    (SELECT indid
                   FROM sysindexkeys
                   WHERE (id = a.id) AND (colid in
                             (SELECT colid
                            FROM syscolumns
                            WHERE (id = a.id) AND (name = a.name))))))) AND
        (xtype = 'PK'))>0 then '√' else '' end) N'主鍵',
 b.name N'類型',
 a.length N'占用字節數',
 COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'長度',
 isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小數位數',
 (case when a.isnullable=1 then '√'else '' end) N'允許空',
 isnull(e.text,'') N'默認值',
 isnull(g.[value],'') AS N'字段說明'
--into ##tx

FROM  syscolumns  a left join systypes b 
on  a.xtype=b.xusertype
inner join sysobjects d 
on a.id=d.id  and  d.xtype='U' and  d.name<>'dtproperties'
left join syscomments e
on a.cdefault=e.id
left join sysproperties g
on a.id=g.id AND a.colid = g.smallid  
order by object_name(a.id),a.colorder

</div></div>

六、 時間格式轉換問題
因為新開發的軟件需要用一些舊軟件生成的一些數據,在時間格式上不統一,只能手工轉換,研究了一下午寫了三條語句,以前沒怎么用過convert函數和case語句,還有"+"操作符在不同上下文環境也會起到不同的作用,把我搞暈了要,不過現在看來是差不多弄好了。

1、把所有"70.07.06"這樣的值變成"1970-07-06"

<div><div> UPDATE lvshi
SET shengri = '19' + REPLACE(shengri, '.', '-')
WHERE (zhiyezheng = '139770070153')</div></div>

 

2、在"1970-07-06"里提取"70","07","06"

<div><div> SELECT SUBSTRING(shengri, 3, 2) AS year, SUBSTRING(shengri, 6, 2) AS month, 
      SUBSTRING(shengri, 9, 2) AS day
FROM lvshi
WHERE (zhiyezheng = '139770070153')
</div></div>

3、把一個時間類型字段轉換成"1970-07-06"

<div><div> UPDATE lvshi
SET shenling = CONVERT(varchar(4), YEAR(shenling)) 
      + '-' + CASE WHEN LEN(MONTH(shenling)) = 1 THEN '0' + CONVERT(varchar(2), 
      month(shenling)) ELSE CONVERT(varchar(2), month(shenling)) 
      END + '-' + CASE WHEN LEN(day(shenling)) = 1 THEN '0' + CONVERT(char(2), 
      day(shenling)) ELSE CONVERT(varchar(2), day(shenling)) END
WHERE (zhiyezheng = '139770070153')
</div></div>

七、 分區視圖
分區視圖是提高查詢性能的一個很好的辦法

<div><div> --看下面的示例

--示例表
create table tempdb.dbo.t_10(
id int primary key check(id between 1 and 10),name varchar(10))

create table pubs.dbo.t_20(
id int primary key check(id between 11 and 20),name varchar(10))

create table northwind.dbo.t_30(
id int primary key check(id between 21 and 30),name varchar(10))
go

--分區視圖
create view v_t
as
select * from tempdb.dbo.t_10
union all
select * from pubs.dbo.t_20
union all
select * from northwind.dbo.t_30
go

--插入數據
insert v_t select 1 ,'aa'
union  all select 2 ,'bb'
union  all select 11,'cc'
union  all select 12,'dd'
union  all select 21,'ee'
union  all select 22,'ff'

--更新數據
update v_t set name=name+'_更新' where right(id,1)=1

--刪除測試
delete from v_t where right(id,1)=2

--顯示結果
select * from v_t
go

--刪除測試
drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
drop view v_t

/**//*--測試結果

id          name       
----------- ---------- 
1           aa_更新
11          cc_更新
21          ee_更新

(所影響的行數為 3 行)
==*/
</div></div>


八、 樹型的實現

<div><div> --參考

--樹形數據查詢示例
--作者: 鄒建

--示例數據
create table [tb]([id] int identity(1,1),[pid] int,name varchar(20))
insert [tb] select 0,'中國'
union  all  select 0,'美國'
union  all  select 0,'加拿大'
union  all  select 1,'北京'
union  all  select 1,'上海'
union  all  select 1,'江蘇'
union  all  select 6,'蘇州'
union  all  select 7,'常熟'
union  all  select 6,'南京'
union  all  select 6,'無錫'
union  all  select 2,'紐約'
union  all  select 2,'舊金山'
go

--查詢指定id的所有子
create function f_cid(
@id int
)returns @re table([id] int,[level] int)
as
begin
 declare @l int
 set @l=0
 insert @re select @id,@l
 while @@rowcount>0
 begin
  set @l=@l+1
  insert @re select a.[id],@l
  from [tb] a,@re b
  where a.[pid]=b.[id] and b.[level]=@l-1
 end
/**//**//**//*--如果只顯示最明細的子(下面沒有子),則加上這個刪除
 delete a from @re a
 where exists(
  select 1 from [tb] where [pid]=a.[id])
--*/
 return
end
go

--調用(查詢所有的子)
select a.*,層次=b.[level] from [tb] a,f_cid(2)b where a.[id]=b.[id]
go

--刪除測試
drop table [tb]
drop function f_cid
go

</div></div>

 

九、 排序問題

<div><div> CREATE TABLE [t] (
 [id] [int] IDENTITY (1, 1) NOT NULL ,
 [GUID] [uniqueidentifier] NULL 
) ON [PRIMARY]
GO</div></div>


下面這句執行5次

<div><div> insert t values (newid())</div></div>


查看執行結果

<div><div> select * from t</div></div>


1、 第一種

<div><div> select * from t
 order by case id when 4 then 1
                  when 5 then 2
                  when 1 then 3
                  when 2 then 4
                  when 3 then 5 end</div></div>


2、 第二種

<div><div> select * from t order by (id+2)%6</div></div>


3、 第三種

<div><div> select * from t order by charindex(cast(id as varchar),'45123')</div></div>


4、 第四種

<div><div> select * from t
WHERE id between 0 and 5
order by charindex(cast(id as varchar),'45123')</div></div>


5、 第五種

<div><div> select * from t order by case when id >3 then id-5 else id end</div></div>


6、 第六種

<div><div> select * from t order by id / 4 desc,id asc</div></div>

 

十、 一條語句刪除一批記錄
首先id列是int標識類類型,然后刪除ID值為5,6,8,9,10,11的列,這里的cast函數不能用convert函數代替,而且轉換的類型必須是varchar,而不能是char,否則就會執行出你不希望的結果,這里的"5,6,8,9,10,11"可以是你在頁面上獲取的一個chkboxlist構建成的值,然后用下面的一句就全部刪
除了,比循環用多條語句高效吧應該。

<div><div> delete from [fujian] where charindex(','+cast([id] as varchar)+',',','+'5,6,8,9,10,11,'+',')>0</div></div>


還有一種就是

<div><div> delete from table1 where id in(1,2,3,4  )</div></div>


十一、獲取子表內的一列數據的組合字符串
下面這個函數獲取05年已經注冊了的某個所的律師,唯一一個參數就是事務所的名稱,然后返回zhuce字段里包含05字樣的所有律師。

<div><div> CREATE   FUNCTION fn_Get05LvshiNameBySuo  (@p_suo Nvarchar(50))
RETURNS Nvarchar(2000)
AS
BEGIN  
 DECLARE @LvshiNames varchar(2000), @name varchar(50)
 select @LvshiNames=''
 DECLARE lvshi_cursor CURSOR FOR</div></div>
數據庫里有1,2,3,4,5 共5條記錄,要用一條sql語句讓其排序,使它排列成4,5,1,2,3,怎么寫?

-- 數據操作 

   
SELECT   -- 從數據庫表中檢索數據行和列 
       INSERT   -- 向數據庫表添加新數據行 
       DELETE   -- 從數據庫表中刪除數據行 
       UPDATE   -- 更新數據庫表中的數據 

  
-- 數據定義 

   
CREATE   TABLE   -- 創建一個數據庫表 
       DROP   TABLE   -- 從數據庫中刪除表 
       ALTER   TABLE   -- 修改數據庫表結構 
       CREATE   VIEW   -- 創建一個視圖 
       DROP   VIEW   -- 從數據庫中刪除視圖 
       CREATE   INDEX   -- 為數據庫表創建一個索引 
       DROP   INDEX   -- 從數據庫中刪除索引 
       CREATE   PROCEDURE   -- 創建一個存儲過程 
       DROP   PROCEDURE   -- 從數據庫中刪除存儲過程 
       CREATE   TRIGGER   -- 創建一個觸發器 
       DROP   TRIGGER   -- 從數據庫中刪除觸發器 
       CREATE   SCHEMA   -- 向數據庫添加一個新模式 
       DROP   SCHEMA   -- 從數據庫中刪除一個模式 
       CREATE  DOMAIN  -- 創建一個數據值域 
       ALTER  DOMAIN  -- 改變域定義 
       DROP  DOMAIN  -- 從數據庫中刪除一個域 

  
-- 數據控制 

   
GRANT   -- 授予用戶訪問權限 
       DENY   -- 拒絕用戶訪問 
       REVOKE   -- 解除用戶訪問權限 

  
-- 事務控制 

   
COMMIT   -- 結束當前事務 
       ROLLBACK   -- 中止當前事務 
       SET   TRANSACTION   -- 定義當前事務數據訪問特征 

  
-- 程序化SQL 

   
DECLARE   -- 為查詢設定游標 
      EXPLAN  -- 為查詢描述數據訪問計划 
       OPEN   -- 檢索查詢結果打開一個游標 
       FETCH   -- 檢索一行查詢結果 
       CLOSE   -- 關閉游標 
       PREPARE   -- 為動態執行准備SQL 語句 
       EXECUTE   -- 動態地執行SQL 語句 
      DESCRIBE  -- 描述准備好的查詢   

  
-- -局部變量 

   
declare   @id   char ( 10
      
-- set @id = '10010001' 
       select   @id   =   ' 10010001 '    

  
-- -全局變量 

  
-- -必須以@@開頭   

  
-- IF ELSE 

  
declare   @x   int   @y   int   @z   int  
      
select   @x   =   1   @y   =   2   @z = 3  
      
if   @x   >   @y  
       
print   ' x > y '   -- 打印字符串'x > y' 
       else   if   @y   >   @z  
       
print   ' y > z '  
      
else   print   ' z > y '  
      
-- CASE 
       use  pangu 
      
update  employee 
      
set  e_wage  =  
       
case  
       
when  job_level  =  ’ 1 ’  then  e_wage * 1.08  
       
when  job_level  =  ’ 2 ’  then  e_wage * 1.07  
       
when  job_level  =  ’ 3 ’  then  e_wage * 1.06  
       
else  e_wage * 1.05  
       
end  
      
-- WHILE CONTINUE BREAK 
       declare   @x   int   @y   int   @c   int  
      
select   @x   =   1   @y = 1  
      
while   @x   <   3  
       
begin  
       
print   @x   -- 打印變量x 的值 
        while   @y   <   3  
       
begin  
       
select   @c   =   100 * @x   +   @y  
       
print   @c   -- 打印變量c 的值 
        select   @y   =   @y   +   1  
       
end  
       
select   @x   =   @x   +   1  
       
select   @y   =   1  
       
end  
      
-- WAITFOR 

  
-- 例 等待1 小時2 分零3 秒后才執行SELECT 語句 

  
waitfor  delay ’ 01 : 02 : 03 ’ 
      
select   *   from  employee 

    
-- 例 等到晚上11 點零8 分后才執行SELECT 語句 

    
waitfor  time ’ 23 : 08 : 00 ’ 


SELECT    

   
select   * (列名)  from  table_name(表名)  where  column_name operator value ex宿主) 
     
select   *   from  stock_information  where  stockid  =   str (nid) 
     stockname 
=   ' str_name '  
     stockname 
like   ' % find this % '  
     stockname 
like   ' [a-zA-Z]% '   -- ------- ([]指定值的范圍) 
     stockname  like   ' [^F-M]% '   -- ------- (^排除指定范圍) 
      -- ------- 只能在使用like關鍵字的where子句中使用通配符) 
      or  stockpath  =   ' stock_path '  
     
or  stocknumber  <   1000  
     
and  stockindex  =   24  
     
not  stocksex  =   ' man '  
     stocknumber 
between   20   and   100  
     stocknumber 
in ( 10 , 20 , 30
     
order   by  stockid  desc ( asc -- ------- 排序,desc-降序,asc-升序 
      order   by   1 , 2   -- ------- by列號 
     stockname  =  ( select  stockname  from  stock_information  where  stockid  =   4
     
-- ------- 子查詢 
      -- ------- 除非能確保內層select只返回一個行的值 
      -- ------- 否則應在外層where子句中用一個in限定符 
      select   distinct  column_name form table_name 
   
-- ------- distinct指定檢索獨有的列值,不重復 
      select  stocknumber ,"stocknumber  +   10 =  stocknumber  +   10   from  table_name 
     
select  stockname , "stocknumber"  =   count ( * from  table_name  group   by  stockname 
     
-- ------- group by 將表按行分組,指定列中有相同的值 
      having   count ( * =   2   -- ------- having選定指定的組 

   
select   *  
     
from  table1, table2 
where  table1.id  *=  table2.id  -- ------ 左外部連接,table1中有的而table2中沒有得以null表示 
     table1.id  =*  table2.id  -- ------ 右外部連接 
      select  stockname  from  table1 
     
union   [ all ]   -- ------ union合並查詢結果集,all-保留重復行 
      select  stockname  from  table2  

   
insert   

   
insert   into  table_name (Stock_name,Stock_number) value ("xxx","xxxx" 
   value (
select  Stockname , Stocknumber  from  Stock_table2) 
   
-- -----value為select語句   

   
update    

   
update  table_name  set  Stockname  =  "xxx"  [ where Stockid = 3 ]  
   Stockname 
=   default  
   Stockname 
=   null  
   Stocknumber 
=  Stockname  +   4    

   
delete    

   
delete   from  table_name  where  Stockid  =   3  
   
truncate  table_name  -- ------- 刪除表中所有行,仍保持表的完整性 
    drop   table  table_name  -- ------- 完全刪除表  

   
alter   table   -- ------ 修改數據庫表結構   

   
alter   table   database .owner.table_name  add  column_name  char ( 2 null  .. 
   sp_help table_name 
-- ------ 顯示表已有特征 
    create   table  table_name (name  char ( 20 ), age  smallint , lname  varchar ( 30 )) 
   
insert   into  table_name  select   -- ------ 實現刪除列的方法(創建新表) 
    alter   table  table_name  drop   constraint  Stockname_default 
   
-- ------- 刪除Stockname的default約束 




常用函數(
function )   

    轉換函數

    
convert (數據類型,值,格式)

  統計函數 

  
AVG   -- 求平均值 
   COUNT   -- 統計數目 
   MAX   -- 求最大值 
   MIN   -- 求最小值 
   SUM   -- 求和  

  
AVG  

  
use  pangu 
  
select   avg (e_wage)  as  dept_avgWage 
  
from  employee 
  
group   by  dept_id   

  
MAX  

  
-- 求工資最高的員工姓名 
   use  pangu 
  
select  e_name 
  
from  employee 
  
where  e_wage  =  
   (
select   max (e_wage) 
   
from  employee)   

  
STDEV () 

  
-- STDEV()函數返回表達式中所有數據的標准差 
   -- STDEVP() 
   -- STDEVP()函數返回總體標准差   

  
VAR () 

  
-- VAR()函數返回表達式中所有值的統計變異數   

  
VARP () 

  
-- VARP()函數返回總體變異數   

  算術函數   

  三角函數 

  
SIN (float_expression)  -- 返回以弧度表示的角的正弦 
   COS (float_expression)  -- 返回以弧度表示的角的余弦 
   TAN (float_expression)  -- 返回以弧度表示的角的正切 
   COT (float_expression)  -- 返回以弧度表示的角的余切 

  反三角函數 

  
ASIN (float_expression)  -- 返回正弦是FLOAT 值的以弧度表示的角 
   ACOS (float_expression)  -- 返回余弦是FLOAT 值的以弧度表示的角 
   ATAN (float_expression)  -- 返回正切是FLOAT 值的以弧度表示的角 
  ATAN2(float_expression1,float_expression2) 
   
-- ----返回正切是float_expression1 /float_expres-sion2的以弧度表示的角 
   DEGREES (numeric_expression) 
   
-- ----把弧度轉換為角度返回與表達式相同的數據類型可為 
    -- ----INTEGER/MONEY/REAL/FLOAT 類型 
   RADIANS (numeric_expression) 
-- ----把角度轉換為弧度返回與表達式相同的數據類型可為 

   
-- ----INTEGER/MONEY/REAL/FLOAT 類型 
   EXP (float_expression)  -- 返回表達式的指數值 
   LOG (float_expression)  -- 返回表達式的自然對數值 
   LOG10 (float_expression) -- 返回表達式的以10 為底的對數值 
   SQRT (float_expression)  -- 返回表達式的平方根 

  取近似值函數 

  
CEILING (numeric_expression) 
-- -----返回>=表達式的最小整數返回的數據類型與表達式相同可為 
    -- -----INTEGER/MONEY/REAL/FLOAT 類型 
   FLOOR (numeric_expression) 
-- -----返回<=表達式的最小整數返回的數據類型與表達式相同可為 
    -- -----INTEGER/MONEY/REAL/FLOAT 類型 
   ROUND (numeric_expression) 
-- -----返回以integer_expression 為精度的四舍五入值返回的數據 
    -- -----類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型 
   ABS (numeric_expression) 
-- -----返回表達式的絕對值返回的數據類型與表達式相同可為 
    -- -----INTEGER/MONEY/REAL/FLOAT 類型 
   SIGN (numeric_expression) 
-- -----測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型 
    -- -----與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型 
   PI ()  -- -----返回值為π 即3.1415926535897936 
   RAND ( [ integer_expression ]
-- -----用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數


字符串函數 

  
ASCII ()  -- ----函數返回字符表達式最左端字符的ASCII 碼值 
   CHAR ()  -- ----函數用於將ASCII 碼轉換為字符 
    -- ----如果沒有輸入0 ~ 255 之間的ASCII 碼值CHAR 函數會返回一個NULL 值 
   LOWER ()  -- ----函數把字符串全部轉換為小寫 
   UPPER ()  -- ----函數把字符串全部轉換為大寫 
   STR ()  -- ----函數把數值型數據轉換為字符型數據 
   LTRIM ()  -- ----函數把字符串頭部的空格去掉 
   RTRIM ()  -- ----函數把字符串尾部的空格去掉 
   LEFT (), RIGHT (), SUBSTRING ()  -- 函數返回部分字符串 
   CHARINDEX (), PATINDEX ()  -- 函數返回字符串中某個指定的子串出現的開始位置 
   SOUNDEX ()  -- ----函數返回一個四位字符碼 
    -- ----SOUNDEX函數可用來查找聲音相似的字符串但SOUNDEX函數對數字和漢字均只返回0 值 
   DIFFERENCE ()  -- ----函數返回由SOUNDEX 函數返回的兩個字符表達式的值的差異 
    -- ----0 兩個SOUNDEX 函數返回值的第一個字符不同 
    -- ----1 兩個SOUNDEX 函數返回值的第一個字符相同 
    -- ----2 兩個SOUNDEX 函數返回值的第一二個字符相同 
    -- ----3 兩個SOUNDEX 函數返回值的第一二三個字符相同 
    -- ----4 兩個SOUNDEX 函數返回值完全相同同 
   QUOTENAME ()  -- ----函數返回被特定字符括起來的字符串 

  
/**/ /*select quotename('abc', '{') quotename('abc') 
  運行結果如下 

  { 
  {abc} [abc]
*/
 
  
REPLICATE ()  -- ----函數返回一個重復character_expression 指定次數的字符串 
   /**/ /*select replicate('abc', 3) replicate( 'abc', -2) 

  運行結果如下 

  abcabcabc NULL
*/
 
  
REVERSE ()  -- ----函數將指定的字符串的字符排列順序顛倒 
   REPLACE ()  -- ----函數返回被替換了指定子串的字符串 
   /**/ /*select replace('abc123g', '123', 'def') 

  運行結果如下 
   
  abcdefg
*/
   

  
SPACE ()  -- ----函數返回一個有指定長度的空白字符串 
   STUFF ()  -- ----函數用另一子串替換字符串指定位置長度的子串   

  數據類型轉換函數 

  
CAST () 函數語法如下 
  
CAST () (  AS   [  length  ]
  
CONVERT () 函數語法如下 
  
CONVERT () ( [  length  ] [ , style ]
  
select   cast ( 100 + 99   as   char convert ( varchar ( 12 ),  getdate ()) 

  運行結果如下 
  
199  Jan  15   2000   

  日期函數 

  
DAY ()  -- ----函數返回date_expression 中的日期值 
   MONTH ()  -- ----函數返回date_expression 中的月份值 
   YEAR ()  -- ----函數返回date_expression 中的年份值 
   DATEADD ( , ,) 
   
-- ---函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期 
   DATEDIFF ( , ,) 
   
-- ---函數返回兩個指定日期在datepart 方面的不同之處 

  
DATENAME ( ,   -- ----函數以字符串的形式返回日期的指定部分 
   DATEPART ( ,   -- ----函數以整數值的形式返回日期的指定部分 
   GETDATE ()  -- ----函數以DATETIME 的缺省格式返回系統當前的日期和時間   

  系統函數 

  
APP_NAME ()  -- ----函數返回當前執行的應用程序的名稱 
   COALESCE ()  -- ---函數返回眾多表達式中第一個非NULL 表達式的值 
   COL_LENGTH ( < ' table_name ' > < ' column_name ' >   -- --函數返回表中指定字段的長度值 
   COL_NAME (,   -- --函數返回表中指定字段的名稱即列名 
   DATALENGTH ()  -- ---函數返回數據表達式的數據的實際長度 
   DB_ID ( [ 'database_name' ] -- ----函數返回數據庫的編號 
   DB_NAME (database_id)  -- ----函數返回數據庫的名稱 
   HOST_ID ()  -- ---函數返回服務器端計算機的名稱 
   HOST_NAME ()  -- ---函數返回服務器端計算機的名稱 
   IDENTITY ( [ , seed increment ] [ AS column_name ]
   
-- IDENTITY() 函數只在SELECT INTO 語句中使用用於插入一個identity column列到新表中 
   /**/ /*select identity(int, 1, 1) as column_name 
   into newtable 
   from oldtable
*/
 

  
ISDATE ()  -- --函數判斷所給定的表達式是否為合理日期 
   ISNULL (,   -- 函數將表達式中的NULL 值用指定值替換 
   ISNUMERIC ()  -- --函數判斷所給定的表達式是否為合理的數值 
   NEWID ()  -- --函數返回一個UNIQUEIDENTIFIER 類型的數值 
   NULLIF (,  
   
-- --NULLIF 函數在expression1 與expression2 相等時返回NULL 值若不相等時則返回xpression1 的值

******************* Transact_SQL ********************

-- 語 句                                功 能
--
數據操作
SELECT        -- 從數據庫表中檢索數據行和列
INSERT        -- 向數據庫表添加新數據行
DELETE        -- 從數據庫表中刪除數據行
UPDATE        -- 更新數據庫表中的數據
--
數據定義
CREATE   TABLE      -- 創建一個數據庫表
DROP   TABLE       -- 從數據庫中刪除表
ALTER   TABLE       -- 修改數據庫表結構
CREATE   VIEW       -- 創建一個視圖
DROP   VIEW       -- 從數據庫中刪除視圖
CREATE   INDEX      -- 為數據庫表創建一個索引
DROP   INDEX       -- 從數據庫中刪除索引
CREATE   PROCEDURE     -- 創建一個存儲過程
DROP   PROCEDURE      -- 從數據庫中刪除存儲過程
CREATE   TRIGGER      -- 創建一個觸發器
DROP   TRIGGER      -- 從數據庫中刪除觸發器
CREATE   SCHEMA      -- 向數據庫添加一個新模式
DROP   SCHEMA       -- 從數據庫中刪除一個模式
CREATE  DOMAIN     -- 創建一個數據值域
ALTER  DOMAIN     -- 改變域定義
DROP  DOMAIN      -- 從數據庫中刪除一個域
--
數據控制
GRANT        -- 授予用戶訪問權限
DENY        -- 拒絕用戶訪問
REVOKE        -- 解除用戶訪問權限
--
事務控制
COMMIT        -- 結束當前事務
ROLLBACK       -- 中止當前事務
SET   TRANSACTION      -- 定義當前事務數據訪問特征
--
程序化SQL
DECLARE        -- 為查詢設定游標
EXPLAN       -- 為查詢描述數據訪問計划
OPEN        -- 檢索查詢結果打開一個游標
FETCH        -- 檢索一行查詢結果
CLOSE        -- 關閉游標
PREPARE        -- 為動態執行准備SQL 語句
EXECUTE        -- 動態地執行SQL 語句
DESCRIBE      -- 描述准備好的查詢 轉自


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM