熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

MS-SQL開發常用匯總和t-sql技巧集錦

2013-11-15 14:36:03  來源: SQL Server 

  把長日期轉換為短日期   Convert(char()getdate())
 MSSQL數據庫開發常用匯總 按姓氏筆畫排序:

  Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as

  數據庫加密:

  select encrypt(原始密碼)
select pwdencrypt(原始密碼)
select pwdcompare(原始密碼加密後密碼) = 相同否則不相同 encrypt(原始密碼)
select pwdencrypt(原始密碼)
select pwdcompare(原始密碼加密後密碼) = 相同否則不相同

  取回表中字段:

  declare @list varchar()@sql nvarchar()
select @list=@list++bname from sysobjects asyscolumns b where aid=bid and aname=表A
set @sql=select +right(@listlen(@list))+ from 表A
exec (@sql)

  查看硬盤分區:

  EXEC masterxp_fixeddrives

  比較AB表是否相等:

  if (select checksum_agg(binary_checksum(*)) from A)
=
(select checksum_agg(binary_checksum(*)) from B)
print 相等
else
print 不相等

  殺掉所有的事件探察器進程:

  DECLARE hcforeach CURSOR GLOBAL FOR SELECT kill +RTRIM(spid) FROM masterdbosysprocesses
WHERE program_name IN(SQL profilerNSQL 事件探查器)
EXEC sp_msforeach_worker ?

  記錄搜索:
開頭到N條記錄

  Select Top N * From 表

N到M條記錄(要有主索引ID)
Select Top MN * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc

N到結尾記錄
Select Top N * From 表 Order by ID Desc

  如何修改數據庫的名稱:

  sp_renamedb old_name new_name

  獲取當前數據庫中的所有用戶表

  select Name from sysobjects where xtype=u and status>=

  獲取某一個表的所有字段

  select name from syscolumns where id=object_id(表名)

  查看與某一個表相關的視圖存儲過程函數

  select a* from sysobjects a syscomments b where aid = bid and btext like %表名%

  查看當前數據庫中所有存儲過程

  select name as 存儲過程名稱 from sysobjects where xtype=P

  查詢用戶創建的所有數據庫

  select * from mastersysdatabases D where sid not in(select sid from mastersyslogins where name=sa)

  或者

  select dbid name AS DB_NAME from mastersysdatabases where sid <> x

  查詢某一個表的字段和數據類型

  select column_namedata_type from inlumns
where table_name = 表名
[n][標題]:
Select * From TableName Order By CustomerName
[n][標題]:

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

  select top * into [t] from [t]
 

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

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

  if exists(select from sysobjects where id=object_id(fgetscript) and objectproperty(idIsInlineFunction)=)
 drop function fgetscript
go

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

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

  創建sqldmo對象
 exec @err=sp_oacreate sqldmosqlserver@srvid output
 if @err<> goto lberr

  連接服務器
 if isnull(@userid)= 如果是 Nt驗證方式
 begin
  exec @err=sp_oasetproperty @srvidloginsecure
  if @err<> goto lberr

  exec @err=sp_oamethod @srvidconnectnull@servername
 end
 else
  exec @err=sp_oamethod @srvidconnectnull@servername@userid@password

  if @err<> goto lberr

  獲取數據庫集
 exec @err=sp_oagetproperty @srviddatabases@dbsid output
 if @err<> goto lberr

  獲取要取得腳本的數據庫id
 exec @err=sp_oamethod @dbsiditem@dbid output@databasename
 if @err<> goto lberr

  獲取要取得腳本的對象id
 exec @err=sp_oamethod @dbidgetobjectbyname@tbid output@objectname
 if @err<> goto lberr

  取得腳本
 exec @err=sp_oamethod @tbidscript@re output
 if @err<> goto lberr

  print @re
 return(@re)

  lberr:
 exec sp_oageterrorinfo NULL @src out @desc out
 declare @errb varbinary()
 set @errb=cast(@err as varbinary())
 exec masterxp_varbintohexstr @errb@re out
 set @re=錯誤號: +@re
   +char()+錯誤源: +@src
   +char()+錯誤描述: +@desc
 return(@re)
end
go

   用法如下
用法如下

  print dbofgetscript(服務器名用戶名密碼數據庫名表名或其它對象名)
 

   如果要獲取庫裡所有對象的腳本如如下方式

  declare @name varchar()
declare #aa cursor for
 select name from sysobjects where xtype not in(SPKDXL)
open #aa
fetch next from #aa into @name
while @@fetch_status=
begin
 print dbofgetscript(onlytiancaisasadatabase@name)
 fetch next from #aa into @name
end
close #aa
deallocate #aa
    聲明此函數是csdn鄒建鄒老大提供的
    三 分隔字符串
如果有一個用逗號分割開的字符串比如說abcd如何用tsql獲取這個字符串有幾個元素獲取第幾個元素的值是多少呢?因為tsql裡沒有split函數也沒有數組的概念所以只能自己寫幾個函數了
    獲取元素個數的函數

  create function getstrarrlength (@str varchar())
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 =
  select @next =
  select @location = charindex(@str@start)
  while (@location <>)
  begin
    select @start = @location +
    select @location = charindex(@str@start)
    select @next =@next +
  end
 select @int_return = @next
 return @int_return
end

   獲取指定索引的值的函數

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

   測試
 

  SELECT [dbo][getstrarrlength](abcd)
SELECT [dbo][getstrofindex](abcd)
 

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

  select * from OPENDATASOURCE(SQLOLEDBData Source=遠程ip;User ID=sa;Password=密碼)庫名dbo表名
 

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

  EXEC sp_addlinkedserver 別名MSDASQLNULLNULLDRIVER={SQL Server};SERVER=遠程名;UID=用戶;PWD=密碼;
exec sp_addlinkedsrvlogin  @rmtsrvname=別名@useself=false@locallogin=sa@rmtuser=sa@rmtpassword=密碼
GO
 

  然後你就可以如下
 

  select * from 別名庫名dbo表名
insert 庫名dbo表名 select * from 別名庫名dbo表名
select * into 庫名dbo新表名 from 別名庫名dbo表名
go
 

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

  Create view fielddesc   
as
select oname as table_namecname as field_nametname as typeclength as

  lengthcisnullable as isnullableconvert(varchar()pvalue) as desp
from syscolumns c 
join systypes t on cxtype = txusertype
join sysobjects o on oid=cid
left join    sysproperties p on psmallid=lid and pid=oid   
where oxtype=U

  查詢時:

  Select * from fielddesc where table_name = 你的表名

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

  SELECT
 (case when lorder= then dname else end) N表名
 lorder N字段序號
 aname N字段名
 (case when COLUMNPROPERTY( aidanameIsIdentity)= then else end) N標識
 (case when (SELECT count(*)
 FROM sysobjects
 WHERE (name in
           (SELECT name
          FROM sysindexes
          WHERE (id = aid) AND (indid in
                    (SELECT indid
                   FROM sysindexkeys
                   WHERE (id = aid) AND (colid in
                             (SELECT colid
                            FROM syscolumns
                            WHERE (id = aid) AND (name = aname))))))) AND
        (xtype = PK))> then else end) N主鍵
 bname N類型
 alength N占用字節數
 COLUMNPROPERTY(aidanamePRECISION) as N長度
 isnull(COLUMNPROPERTY(aidanameScale)) as N小數位數
 (case when aisnullable= then else end) N允許空
 isnull(etext) N默認值
 isnull(g[value]) AS N字段說明
into ##tx

  FROM  syscolumns  a left join systypes b
on  axtype=bxusertype
inner join sysobjects d
on aid=did  and  dxtype=U and  dname<>dtproperties
left join syscomments e
on acdefault=eid
left join sysproperties g
on aid=gid AND lid = gsmallid 
order by object_name(aid)lorder

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

  把所有這樣的值變成

  UPDATE lvshi
SET shengri = + REPLACE(shengri )
WHERE (zhiyezheng = )

  裡提取

  SELECT SUBSTRING(shengri ) AS year SUBSTRING(shengri ) AS month
      SUBSTRING(shengri ) AS day
FROM lvshi
WHERE (zhiyezheng = )
 

  把一個時間類型字段轉換成

  UPDATE lvshi
SET shenling = CONVERT(varchar() YEAR(shenling))
      + + CASE WHEN LEN(MONTH(shenling)) = THEN + CONVERT(varchar()
      month(shenling)) ELSE CONVERT(varchar() month(shenling))
      END + + CASE WHEN LEN(day(shenling)) = THEN + CONVERT(char()
      day(shenling)) ELSE CONVERT(varchar() day(shenling)) END
WHERE (zhiyezheng = )

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

  看下面的示例

  示例表
create table tempdbdbot_(
id int primary key check(id between and )name varchar())

  create table pubsdbot_(
id int primary key check(id between and )name varchar())

  create table northwinddbot_(
id int primary key check(id between and )name varchar())
go

  分區視圖
create view v_t
as
select * from tempdbdbot_
union all
select * from pubsdbot_
union all
select * from northwinddbot_
go

  插入數據
insert v_t select aa
union  all select bb
union  all select cc
union  all select dd
union  all select ee
union  all select ff

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

  刪除測試
delete from v_t where right(id)=

  顯示結果
select * from v_t
go

  刪除測試
drop table northwinddbot_pubsdbot_tempdbdbot_
drop view v_t

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

  id          name      

           aa_更新
          cc_更新
          ee_更新

  (所影響的行數為 行)
==*/

  八 樹型的實現

  參考

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

  示例數據

  create table [tb]([id] int identity()[pid] intname varchar())
insert [tb] select 中國
union  all  select 美國
union  all  select 加拿大
union  all  select 北京
union  all  select 上海
union  all  select 江蘇
union  all  select 蘇州
union  all  select 常熟
union  all  select 南京
union  all  select 無錫
union  all  select 紐約
union  all  select 舊金山
go

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

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

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

  九 排序問題

  CREATE TABLE [t] (
 [id] [int] IDENTITY ( ) NOT NULL
 [GUID] [uniqueidentifier] NULL
) ON [PRIMARY]
GO
 

  下面這句執行

  insert t values (newid())
 

  查看執行結果

  select * from t
 

   第一種

  select * from t
 order by case id when then
                  when then
                  when then
                  when then
                  when then end
 

   第二種

  select * from t order by (id+)%
 

   第三種

  select * from t order by charindex(cast(id as varchar))
 

   第四種

  select * from t
WHERE id between and
order by charindex(cast(id as varchar))
 

   第五種

  select * from t order by case when id > then id else id end
 

   第六種

  select * from t order by id / descid asc

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

  delete from [fujian] where charindex(+cast([id] as varchar)+++)>
 

  還有一種就是

  delete from table where id in( )
 

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

  CREATE   FUNCTION fn_GetLvshiNameBySuo  (@p_suo Nvarchar())
RETURNS Nvarchar()
AS
BEGIN 
 DECLARE @LvshiNames varchar() @name varchar()
 select @LvshiNames=
 DECLARE lvshi_cursor CURSOR FOR
 

  數據庫裡有條記錄要用一條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 描述准備好的查詢  

  局部變量

  declare @id char()
      set @id =
      select @id =   

  全局變量

  必須以@@開頭  

  IF ELSE

  

  declare @x int @y int @z int
      select @x = @y = @z=
      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 = then e_wage*
       when job_level = then e_wage*
       when job_level = then e_wage*
       else e_wage*
       end
      WHILE CONTINUE BREAK
      declare @x int @y int @c int
      select @x = @y=
      while @x <
       begin
       print @x 打印變量x 的值
       while @y <
       begin
       select @c = *@x + @y
       print @c 打印變量c 的值
       select @y = @y +
       end
       select @x = @x +
       select @y =
       end
      WAITFOR

  例 等待 小時 分零 秒後才執行SELECT 語句

  waitfor delay ::
      select * from employee

  例 等到晚上 點零 分後才執行SELECT 語句

  waitfor time ::

  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 [azAZ]% ([]指定值的范圍)
     stockname like [^FM]% (^排除指定范圍)
     只能在使用like關鍵字的where子句中使用通配符)
     or stockpath = stock_path
     or stocknumber <
     and stockindex =
     not stocksex = man
     stocknumber between and
     stocknumber in()
     order by stockid desc(asc) 排序desc降序asc升序
     order by by列號
     stockname = (select stockname from stock_information where stockid = )
     子查詢
     除非能確保內層select只返回一個行的值
     否則應在外層where子句中用一個in限定符
     select distinct column_name form table_name
   distinct指定檢索獨有的列值不重復
     select stocknumber stocknumber + = stocknumber + from table_name
     select stockname stocknumber = count(*) from table_name group by stockname
     group by 將表按行分組指定列中有相同的值
     having count(*) = having選定指定的組

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

  insert 

  insert into table_name (Stock_nameStock_number) value (xxxxxxx
   value (select Stockname Stocknumber from Stock_table)
   value為select語句  

  update  

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

  delete  

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

  alter table 修改數據庫表結構  

  alter table databaseownertable_name add column_name char() null
   sp_help table_name 顯示表已有特征
   create table table_name (name char() age smallint lname varchar())
   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 值的以弧度表示的角
  ATAN(float_expressionfloat_expression)
   返回正切是float_expression /float_expression的以弧度表示的角
  DEGREES(numeric_expression)
   把弧度轉換為角度返回與表達式相同的數據類型可為
   INTEGER/MONEY/REAL/FLOAT 類型
  RADIANS(numeric_expression)
把角度轉換為弧度返回與表達式相同的數據類型可為

  INTEGER/MONEY/REAL/FLOAT 類型
  EXP(float_expression) 返回表達式的指數值
  LOG(float_expression) 返回表達式的自然對數值
  LOG(float_expression)返回表達式的以 為底的對數值
  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)
測試參數的正負號返回 零值 正數或 負數返回的數據類型
   與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
  PI() 返回值為π 即
  RAND([integer_expression])
用任選的[integer_expression]做種子值得出 間的隨機浮點數

  字符串函數

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

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

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

  運行結果如下

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

  運行結果如下
  
  abcdefg*/  

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

  數據類型轉換函數

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

  運行結果如下
   Jan  

  日期函數

  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 ) as column_name
   into newtable
   from oldtable*/

  ISDATE() 函數判斷所給定的表達式是否為合理日期
  ISNULL(  函數將表達式中的NULL 值用指定值替換
  ISNUMERIC() 函數判斷所給定的表達式是否為合理的數值
  NEWID() 函數返回一個UNIQUEIDENTIFIER 類型的數值
  NULLIF( 
   NULLIF 函數在expression 與expression 相等時返回NULL 值若不相等時則返回xpression 的值 *******************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     描述准備好的查詢

  局部變量
declare @id char()
set @id =
select @id =

  全局變量
必須以@@開頭

  IF ELSE
declare @x int @y int @z int
select @x = @y = @z=
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 = then e_wage*
  when job_level = then e_wage*
  when job_level = then e_wage*
  else e_wage*
 end

  WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = @y=
while @x <
 begin
  print @x 打印變量x 的值
  while @y <
   begin
    select @c = *@x + @y
    print @c 打印變量c 的值
    select @y = @y +
   end
  select @x = @x +
  select @y =
 end

  WAITFOR
例 等待 小時 分零 秒後才執行SELECT 語句
waitfor delay ::
select * from employee
例 等到晚上 點零 分後才執行SELECT 語句
waitfor time ::
select * from employee

  ***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 [azAZ]% ([]指定值的范圍)
     stockname like [^FM]%   (^排除指定范圍)
     只能在使用like關鍵字的where子句中使用通配符)
     or stockpath = stock_path
     or stocknumber <
     and stockindex =
     not stocksex = man
     stocknumber between and
     stocknumber in()
     order by stockid desc(asc) 排序desc降序asc升序
     order by by列號
     stockname = (select stockname from stock_information  where stockid  = )
     子查詢
     除非能確保內層select只返回一個行的值
     否則應在外層where子句中用一個in限定符
  select distinct column_name form table_name distinct指定檢索獨有的列值不重復
  select stocknumber stocknumber + = stocknumber + from table_name
  select stockname stocknumber = count(*) from table_name group by stockname
                                      group by 將表按行分組指定列中有相同的值
          having count(*) =     having選定指定的組
       
  select *
  from table table                 
  where tableid *= tableid 左外部連接table中有的而table中沒有得以null表示
     tableid =* tableid 右外部連接

  select stockname from table
  union [all]    union合並查詢結果集all保留重復行
  select stockname from table

  ***insert***

  insert into table_name (Stock_nameStock_number) value (xxxxxxx)
              value (select Stockname Stocknumber from Stock_table)value為select語句

  ***update***

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

  ***delete***

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

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

  alter table databaseownertable_name add column_name char() null
  sp_help table_name 顯示表已有特征
  create table table_name (name char() age smallint lname varchar())
  insert into table_name select  實現刪除列的方法(創建新表)
  alter table table_name drop constraint Stockname_default 刪除Stockname的default約束
   
***function(/**//*常用函數*/)***

  統計函數
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 值的以弧度表示的角
ATAN(float_expressionfloat_expression)
        返回正切是float_expression /float_expression的以弧度表示的角
DEGREES(numeric_expression)
                       把弧度轉換為角度返回與表達式相同的數據類型可為
        INTEGER/MONEY/REAL/FLOAT 類型
RADIANS(numeric_expression) 把角度轉換為弧度返回與表達式相同的數據類型可為
        INTEGER/MONEY/REAL/FLOAT 類型
EXP(float_expression)  返回表達式的指數值
LOG(float_expression)  返回表達式的自然對數值
LOG(float_expression)返回表達式的以 為底的對數值
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)     測試參數的正負號返回 零值 正數或 負數返回的數據類型
        與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
PI()       返回值為π 即
RAND([integer_expression])   用任選的[integer_expression]做種子值得出 間的隨機浮點數

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

  QUOTENAME()  函數返回被特定字符括起來的字符串
/**//*select quotename(abc {) quotename(abc)
運行結果如下
{
{abc} [abc]*/

  REPLICATE()     函數返回一個重復character_expression 指定次數的字符串
/**//*select replicate(abc ) replicate( abc )
運行結果如下

abcabcabc NULL*/

  REVERSE()       函數將指定的字符串的字符排列順序顛倒
REPLACE()       函數返回被替換了指定子串的字符串
/**//*select replace(abcg def)
運行結果如下

abcdefg*/

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

  數據類型轉換函數
CAST() 函數語法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函數語法如下
CONVERT() (<data_ type>[ length ] <expression> [ style])

  select cast(+ as char) convert(varchar() getdate())
運行結果如下

   Jan

  日期函數
DAY()   函數返回date_expression 中的日期值
MONTH()   函數返回date_expression 中的月份值
YEAR()   函數返回date_expression 中的年份值
DATEADD(<datepart> <number> <date>)
    函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期
DATEDIFF(<datepart> <number> <date>)
    函數返回兩個指定日期在datepart 方面的不同之處
DATENAME(<datepart> <date>)  函數以字符串的形式返回日期的指定部分
DATEPART(<datepart> <date>)  函數以整數值的形式返回日期的指定部分
GETDATE()  函數以DATETIME 的缺省格式返回系統當前的日期和時間

  系統函數
APP_NAME()      函數返回當前執行的應用程序的名稱
COALESCE()  函數返回眾多表達式中第一個非NULL 表達式的值
COL_LENGTH(<table_name> <column_name>) 函數返回表中指定字段的長度值
COL_NAME(<table_id> <column_id>)   函數返回表中指定字段的名稱即列名
DATALENGTH() 函數返回數據表達式的數據的實際長度
DB_ID([database_name]) 函數返回數據庫的編號
DB_NAME(database_id)  函數返回數據庫的名稱
HOST_ID()     函數返回服務器端計算機的名稱
HOST_NAME()     函數返回服務器端計算機的名稱
IDENTITY(<data_type>[ seed increment]) [AS column_name])
 IDENTITY() 函數只在SELECT INTO 語句中使用用於插入一個identity column列到新表中
/**//**//**//*select identity(int ) as column_name
 into newtable
 from oldtable*/
ISDATE()  函數判斷所給定的表達式是否為合理日期
ISNULL(<check_expression> <replacement_value>) 函數將表達式中的NULL 值用指定值替換
ISNUMERIC()  函數判斷所給定的表達式是否為合理的數值
NEWID()   函數返回一個UNIQUEIDENTIFIER 類型的數值
NULLIF(<expression> <expression>)
 NULLIF 函數在expression 與expression 相等時返回NULL 值若不相等時則返回expression 的值


From:http://tw.wingwit.com/Article/program/SQLServer/201311/22045.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.