2018年1月29日 星期一

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

MS-SQL開發常用匯總和t-sql技巧集錦
 1.把長日期轉換為短日期   Convert(char(10),getdate(),120)
 MS-SQL資料庫開發常用匯總 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].[標題]:
   一、 只複製一個表結構,不複製資料
select top 0 * into [t1] from [t2]
     二、 獲取資料庫中某個物件的創建腳本
    1、 先用下面的腳本創建一個函數
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
2、 用法如下
用法如下,
print dbo.fgetscript('伺服器名','用戶名','密碼','資料庫名','表名或其他物件名')
 
    3、 如果要獲取庫裏所有物件的腳本,如如下方式
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

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

    2、 獲取指定索引的值的函數
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

    3、 測試
 SELECT [dbo].[getstrarrlength]('1,2,3,4,a,b,c,d')
SELECT [dbo].[getstrofindex]('1,2,3,4,a,b,c,d',5)
 
    四、 一條語句執行跨越若干個資料庫
我要在一條語句裏操作不同的伺服器上的不同的資料庫裏的不同的表,怎麼辦呢?
第一種方法:
select * from OPENDATASOURCE('SQLOLEDB','Data Source=遠程ip;User ID=sa;Password=密碼').庫名.dbo.表名
 
第二種方法:
先使用聯結伺服器:
EXEC sp_addlinkedserver '別名','','MSDASQL',NULL,NULL,'DRIVER={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 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'
查詢時:
Select * from fielddesc where table_name = '你的表名'
還有個更強的語句,是鄒建寫的,也寫出來吧
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

    六、 時間格式轉換問題
因為新開發的軟體需要用一些舊軟體生成的一些資料,在時間格式上不統一,只能手工轉換,研究了一下午寫了三條語句,以前沒怎麼用過convert函數和case語句,還有"+"操作符在不同上下文環境也會起到不同的作用,把我搞暈了要,不過現在看來是差不多弄好了。
    1、把所有"70.07.06"這樣的值變成"1970-07-06"
UPDATE lvshi
SET shengri = '19' + REPLACE(shengri, '.', '-')
WHERE (zhiyezheng = '139770070153')
    2、在"1970-07-06"裏提取"70","07","06"
SELECT SUBSTRING(shengri, 3, 2) AS year, SUBSTRING(shengri, 6, 2) AS month,
      SUBSTRING(shengri, 9, 2) AS day
FROM lvshi
WHERE (zhiyezheng = '139770070153')
 
    3、把一個時間類型欄位轉換成"1970-07-06"
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')
    七、 分區視圖
分區視圖是提高查詢性能的一個很好的辦法
--看下麵的示例
--示例表
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 行)
==*/
 八、 樹型的實現

--參考
--樹形資料查詢示例
--作者: 鄒建
--示例數據

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
    九、 排序問題
CREATE TABLE [t] (
 [id] [int] IDENTITY (1, 1) NOT NULL ,
 [GUID] [uniqueidentifier] NULL
) ON [PRIMARY]
GO
 
下麵這句執行5次
insert t values (newid())
 
查看執行結果

select * from t
 
    1、 第一種

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
 
    2、 第二種

select * from t order by (id+2)%6
 
    3、 第三種

select * from t order by charindex(cast(id as varchar),'45123')
 
    4、 第四種

select * from t
WHERE id between 0 and 5
order by charindex(cast(id as varchar),'45123')
 
    5、 第五種

select * from t order by case when id >3 then id-5 else id end
 
    6、 第六種

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

delete from [fujian] where charindex(','+cast([id] as varchar)+',',','+'5,6,8,9,10,11,'+',')>0
 
還有一種就是

delete from table1 where id in(1,2,3,4 )
 
    十一、獲取子表內的一列資料的組合字串
下面這個函數獲取05年已經註冊了的某個所的律師,唯一一個參數就是事務所的名稱,然後返回zhuce欄位裏包含05字樣的所有律師。

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
 
資料庫裏有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     --描述準備好的查詢
---局部變數
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 * 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 '[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(/**//*常用函數*/)***
----統計函數----
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 值若不相等時則返回expression1 的值

source: http://mypaper.pchome.com.tw/nut0322/post/1313468403 

2018年1月15日 星期一

ASP.NET和SQL 語法



外部連接
SELECT A1.Store_Name, SUM(A2.Sales) SALES
FROM Georgraphy A1, Store_Information A2
WHERE A1.Store_Name = A2.Store_Name (+)
GROUP BY A1.Store_Name;

強制分辨大小寫
SELECT * FROM MEMBER_TABLE WHERE cName COLLATE Latin1_General_CS_AI = 'John'

  1. Case Sensitivity (CS):強制視別大小寫
  2. Case Insensitive (CI):不強制視別大小寫
  3. Accent Sensitivity (AS):強制視別音腔,通常出現在歐洲語系
  4. Accent Insensitive (AI):不強制視別音腔
  5. Kana Sensitivity (KS):強制視別平假、片假名
  6. Kana Insensitive (KI):不強制視別平假、片假名
  7. Width Sensitivity (WS):強制視別中文的全型字與英文字,例如abc與abc是不一樣的
  8. Width Insensitive (WI):不強制視別中文的全型字與英文字

模糊查詢
一般模糊語句如下:

Select 欄位 FROM 表 Where 某欄位 Like 條件


其中關於條件,SQL提供了四種匹配模式:

1,%:表示任意0個或多個字元。可匹配任意類型和長度的字元,有些情況下若是中文,請使用兩個百分號(%%)表示。

 Select * FROM [user] Where u_name LIKE '%三%'

將會把u_name為「張三」,「張貓三」、「三腳貓」,「唐三藏」等等有「三」的記錄全找出來。

另外,如果需要找出u_name中既有「三」又有「貓」的記錄,請使用and條件
Select * FROM [user] Where u_name LIKE '%三%' AND u_name LIKE '%貓%'

若使用 程式碼
Select * FROM [user] Where u_name LIKE '%三%貓%'
雖然能搜索出「三腳貓」,但不能搜索出符合條件的「張貓三」。

2,_: 表示任意單個字元。匹配單個任一字元,它常用來限制運算式的字元長度語句:

比如 
Select * FROM [user] Where u_name LIKE '_三_'
只找出「唐三藏」這樣u_name為三個字且中間一個字是「三」的;

再比如
Select * FROM [user] Where u_name LIKE '三__';
只找出「三腳貓」這樣name為三個字且第一個字是「三」的;


3,[ ]:表示括弧內所列字元中的一個(類似正則運算式)。指定一個字元、字串或範圍,要求所匹配物件為它們中的任一個。

比如
Select * FROM [user] Where u_name LIKE '[張李王]三'
將找出「張三」、「李三」、「王三」(而不是「張李王三」);

如 [ ] 內有一系列字元(01234、abcde之類的)則可略寫為「0-4」、「a-e」
Select * FROM [user] Where u_name LIKE '老[1-9]'
將找出「老1」、「老2」、......、「老9」;

4,[^ ] :表示不在括弧所列之內的單個字元。其取值和 [] 相同,但它要求所匹配物件為指定字元以外的任一個字元。

比如
Select * FROM [user] Where u_name LIKE '[^張李王]三'
將找出不姓「張」、「李」、「王」的「趙三」、「孫三」等;

Select * FROM [user] Where u_name LIKE '老[^1-4]'
將排除「老1」到「老4」,尋找「老5」、「老6」、......

5,查詢內容包含萬用字元時

由於萬用字元的緣故,導致我們查詢特殊字元「%」、「_」、「[」的語句無法正常實現,而把特殊字元用「[ ]」括起便可正常查詢。據此我們寫出以下函數:

Asp的替換語句,可以參考一下

function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function

在查詢前將待查字串先經該函數處理即可。


該文章轉載自德仔工作室:HTTP://www.dezai.cn/Article_Show.asp?ArticleID=23862


1.INSERT INTO SELECT語法

  語法為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1
  要求目標表Table2必須存在,由於目標表Table2已經存在,所以我們除了插入源表Table1的字段外,才可以插入常量。

2.SELECT INTO FROM語法

  語法為:SELECT vale1, value2 into Table2 from Table1

  要求目標表Table2不存在,因為在插入時會自動創建表Table2,並將Table1中指定字段數據復制到 Table2中。

---------------------------

DataReader 擷取資料



asp .net 連接sql (ExecuteReader)

查詢  →   command.ExecuteReader();         回傳sqlDataReader

新增、修改、刪除 →   command.ExecuteNonQuery();           回傳int