sql 2008常用語法語句收集


EXEC sp_dropuser 'test'   : 從當前數據庫刪除用戶 test
EXEC sp_droplogin 'test'  : 從 SQL Server 中刪除登錄 test
select @@servername    :查看本機sql 2008實例名
set quoted_identifier off  :關閉雙引號識別
sp_who :查詢當前使用用戶,進程
sp_helptext 函數或者觸發器或者存儲過程名   :查看代碼
sp_helpindex 'table' 查看索引
kill 進程號
dbcc showcontig('u_table') --檢查表碎片
DBCC DBREINDEX ('u_table','',90)   --優化表重建索引

sp_spaceused  :查看當前數據庫大小
dbcc checkdb 檢查數據庫是否有錯,是否損壞  
select serverproperty('productlevel')  --檢查是否打了SP4補丁,如果沒有打過SP4,則為RTM,否則顯示的是SP4版本。
select DATABASEPROPERTYEX('master','version') --查看當前SQL版本號


建表前的判斷語句:
if object_id('a') is not null drop table a
create table a(times datetime)
select * from sysobjects  --系統對象表
xtype: u表;v視圖; p:過程 fn:函數 tr:觸發器
select * from sysindexes –查看索引
select * from syscolumns  --系統字段表
select * from syscolumns  where object_id('u_ware_q')=id
select * from syscolumns where object_name(id) = 'u_ware_q'
select object_name(id),* from syscolumns where object_name(id)='u_ware_p' --根據某個字段查出是哪個表
 select * from sysobjects a, syscolumns b where a.id=b.id and b.name = 'maxunit' --查看使用某字段的所有表
select * from syscomments    --函數,觸發器等的代碼
例:查所有觸發器 存儲過程有發短信的代碼
select object_name(id) from syscomments where text like '%短信'
select * from syscolumns where id=object_id('u_ware_q')
select system_user  --當前操作系統用戶
select user --當前數據庫登錄用戶
SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME='u_ware_q' --查看表的主鍵
sp_helptext p_物流發送后發短信   --顯示所有封裝后的代碼
  用SQL語句查找包含有某個關鍵字的存儲過程、觸發器、函數等等,SQL語句如下:
select OBJECT_NAME(id) as 存儲過程,id from syscomments 
where id in (select   object_id(name)   from dbo.sysobjects   where type='P'  --存儲過程為P)
and text like '%FieldName%'  --關鍵字
group by id 

--查表依賴關系
select a.* from sysobjects a, syscomments b where a.id =b.id and b.text like '%u_store_i%'
--斷開所有鏈接
DECLARE @sql VARCHAR(4000)
SET @sql= ''
SELECT @sql = @sql + ' kill  ' + CAST(spid AS VARCHAR) + CHAR(13)
FROM master.sys.sysprocesses WHERE dbid = db_id( 'CMDK_DEV')
EXEC(@sql)
  
EXEC sp_executesql @sql

xtype:對象類型。可以是下列對象類型中的一種: 
C = CHECK 約束
D = 默認值或 DEFAULT 約束
F = FOREIGN KEY 約束
L = 日志
FN = 標量函數
IF = 內嵌表函數
P = 存儲過程
PK = PRIMARY KEY 約束(類型是 K)
RF = 復制篩選存儲過程
S = 系統表
TF = 表函數
TR = 觸發器
U = 用戶表
UQ = UNIQUE 約束(類型是 K)
V = 視圖
X = 擴展存儲過程

--常用函數
select len('我是中國人')  --取字符串
select datalength('我是中國人sddsfs')  --取長字符串長度
select dbo.f_left('我是中國人sdflskfsjkl',6)    --取字符串:我是中 只在海典系統中使用
select left('我是中國人sdfksfls',6) --取字符串:我是中國人a,漢字作為一個字符
select replace('我是中國人lkklkl','','asdd')  --替換
select REPLACE (' 處方信' ,' ','')  --去掉字符串中所有空格
select rtrim('我是中國人  ')  --去掉右空格
select ltrim('   我是中國人')  --去掉左空格
select right('test-tsss',charindex('-','test-tsss')-1) --取'-'第一次開始的右邊所有字符
select isnumeric('222ss--2sdsd')  -- select isnumeric('s222s') --當輸入表達式得數為一個有效的整數、浮點數、money 或decimal 類型,那么ISNUMERIC 返回;否則返回。返回值為確保可以將expression 轉換為上述數字類型中的一種。但是此函數存在Bug,就是'234a2342'同樣會認為是數字類型可以替代的寫法是
select PATINDEX('%[^0-9]%', '234122')  --等於0為純數字--如果返回值大於0,則有非數字字符。
--對於支持小數點和正負數寫法是
select PATINDEX('%[^0~9|.|-|+]%','22.22')
select patindex('%[吖-座]%','2221在sss') --有中文返回5
select patindex('%[d]%','rcrdsddddaadadffdr')
--返回,[]中d在字符串rcrdsddddaadadffdr的第一次出現的位置。
select patindex('%[cd]%','rcrdsdddrdaadadffdr')
--返回,[]中c,d在其中一個的位置,返回最先出現的這個位置,c在此字符串里第一次出現位置是,而d是,結果取最先的那個。
select patindex('%[sd]%','rcrdsdddrdaadadffdr')
--返回,[]中c,d在其中一個的位置,返回最先出現的這個位置,s在此字符串里第一次出現位置是,而d是,結果取最先的那個。
select patindex('%[^r]%','rrrdsdddrdaadadffdr')
--返回,除[]中的字符串的匹配字符,第一次出現d不在[^r]里,所以就找到第一次這位。
select patindex('%[^rd]%','rrrdsdddrdaadadffdr')
--返回,除[]中的字符串的匹配字符,第一次出現s不在[^rd]里,所以就找到第一次這位。
select patindex('%[^rsd]%','rrrdsdddrdaadadffdr')
--返回,除[]中的字符串的匹配字符,第一次出現a不在[^rsd]里,所以就找到第一次這位。
max()  --取最大值min()  --取最小值sum()  --求和count() --統計記錄數
select accdate,sum(realamt),max(realamt),min(realamt),count(realamt)
from r_sale
where accdate>'2011-01-15 00:00:00.000' and accdate < '2011-01-25 00:00:00.000'
group by accdate
having sum(realamt) > 60000
字符截取:left()、right()、substring()、charindex()
select SUBSTRING(warename,1,4) from u_ware   --取字符串,從第1個字符開始至第4個結束
select SUBSTRING(CONVERT(text,'在s在在奪要'),1,5) --截取中英混合的字符串(中文和字母)
select 5000/10000.0 --想變成.5
select 5500/10000.0 --想變成.55
select 5550/10000.0 --想變成.555
select 5555/10000.0 --想變成.5555
其結果分別為:0.5000000    0.5500000  0.5550000   0.5555000
select 15%4 結果為 判斷是否整除,是否整數倍
select 15%5 結果為
一、如果想去掉數字后面多余的 ,需要轉化一下:
--取隨機數
 select  ceiling(10 * rand())
 select rand()
select ceiling(RAND()*(60-20)+20) --隨機生成20-60之間的一個整數
select CONVERT(FLOAT,5000/10000.0) --想變成.5
select CONVERT(FLOAT,5500/10000.0) --想變成.55
select CONVERT(FLOAT,5550/10000.0) --想變成.555
select CONVERT(FLOAT,5555/10000.0) --想變成.5555

其結果分別為: 0.5  0.55  0.555 0.5555
--Sql截取浮點小數位數,不四舍五入
round(551.239567,2,0)
結果:551.24

round(551.239567,2,1)
結果:551.23

--第一個表示截取位
--第二個,1分別表示是四舍五入,0以外是截取
select cast(19.001 as int) --數字型取整數部分
select 19.001 - cast(19.001 as int) --數字型取小數部分
select distinct wareid from u_store_m  --過濾重復記錄 唯一
select space(10)   --返回個空格字符串
--兩個數據集連接
select wareid from u_accept_c
union all  
select wareid from u_store_m where symqty>1000
--存在於某個數據集值in 、not in
select * from u_ware_q where wareid in('2339','12233')
select * from u_ware_q where wareid not in(select wareid from u_ware_class where classcode ='01010')
--存在於某個數據集exists 、not exists ,盡量用這個優化數據集查詢速度,可用在多表操作
select * from u_ware_q a where exists(select 1 from u_sale_c b where a.wareid = b.wareid)  --查詢沒有銷售記錄的商品

--查看表約束
sp_helpconstraint  d_ware_print
--修改 刪除主鍵
alter table 表名 drop constraint 約束名/主鍵名

--給字段默認值
ALTER TABLE [dbo].[u_ware_q] ADD  DEFAULT (0) FOR [pile]

if col_length('c_dyscript','projectid') is null
   alter table c_dyscript add projectid int default 0
go
update c_dyscript set projectid = 0 where projectid is null
go
if exists(select * from syscolumns where id = object_id('c_dyscript') and name = 'projectid' and isnullable = 1)
   alter table c_dyscript alter column projectid int not null
go
declare @sql_20140317 nvarchar(1000)
select @sql_20140317 = 'alter table c_dyscript drop constraint [' + name + ']' from sysobjects where parent_obj = object_id('c_dyscript') and xtype = 'pk'
exec(@sql_20140317)
go
alter table c_dyscript add primary key(winname,projectid,control,event)
go

select floor(11.23)  --返回小於或等於所給數字表達式的最大整數。向下取整
select ceiling(11.23)  --向上取整數四舍五入
select round(11.23334,2)  --取兩位小數
select abs(112.22),abs(-112.33)  --取絕對值
select max(stamp)+0 from d_ecs_order_info
select convert(int max(stamp)) from d_ecs_order_info  顯式轉換
cast((c.supply_qty+0.0)/isnull(a.supply_sumqty,1) as numeric(16,4)) –兩個整數相除得行小數的方法   

isnull(可能為空字段,'')   : sql判斷是否為空的寫法,如果字段為空的話,就賦''給某個字段。
IDENTITY(int,1,1)   :在表中插入遞增數
Case 用法:以計算毛利為例:
select case when saleprice =0 then 0 else (saleprice -purprice)/ saleprice end as 毛利率
from u_sale_c
where 條件….

select LTRIM(RTRIM(str(商品編碼)+'1')),商品名稱,商品規格
,case when isnull(生產企業,'')='' then '' else 生產企業 end
from 商品資料測試
時間字段轉換
select CONVERT(varchar(12),execdate,23)from u_distapply_m where CONVERT(varchar(12),execdate,23)='2014-05-06' --取時間字段中的日期
CONVERT(varchar(25),dateadd(day,-2,execdate),21 )  --取日期的前兩天
datediff(dd,r_sale.accdate,dateadd(mm,1,r_sale.accdate)) –計算當月天數
select datediff(dd,'2016-01-01',getdate()) --從某天至現在的天數
SELECT CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
 SELECT CONVERT(varchar(100), GETDATE(), 1): 05/16/06
 SELECT CONVERT(varchar(100), GETDATE(), 2): 06.05.16
 SELECT CONVERT(varchar(100), GETDATE(), 3): 16/05/06
 SELECT CONVERT(varchar(100), GETDATE(), 4): 16.05.06
 SELECT CONVERT(varchar(100), GETDATE(), 5): 16-05-06
 SELECT CONVERT(varchar(100), GETDATE(), 6): 16 05 06
 SELECT CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
 SELECT CONVERT(varchar(100), GETDATE(), 8): 10:57:46
 SELECT CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
 SELECT CONVERT(varchar(100), GETDATE(), 10): 05-16-06
 SELECT CONVERT(varchar(100), GETDATE(), 11): 06/05/16
 SELECT CONVERT(varchar(100), GETDATE(), 12): 060516
 SELECT CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
 SELECT CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
 SELECT CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
 SELECT CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
 SELECT CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
 SELECT CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
 SELECT CONVERT(varchar(100), GETDATE(), 24): 10:57:47
 SELECT CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
 SELECT CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
 SELECT CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
 SELECT CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
 SELECT CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
 SELECT CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
 SELECT CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
 SELECT CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
 SELECT CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
 SELECT CONVERT(varchar(100), GETDATE(), 108): 10:57:49
 SELECT CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
 SELECT CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
 SELECT CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
 SELECT CONVERT(varchar(100), GETDATE(), 112): 20060516
 SELECT CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
 SELECT CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
 SELECT CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
 SELECT CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49:000
select CONVERT(datetime,'2015-06-04 10:46:21', 20)  字符轉換為日期
select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))/*上個月一號*/  
select   dateadd(dd,-day(getdate()),getdate()) /* 上月月底*/  
select   dateadd(dd,-day(getdate())+1,getdate())  /* 本月一號*/  
select   dateadd(dd,-day(dateadd(month,1,getdate())),dateadd(month,1,getdate()))/* 本月底*/  
select   dateadd(dd,-day(dateadd(month,1,getdate()))+1,dateadd(month,1,getdate()))        /* 下月一號*/  
select   dateadd(dd,-day(dateadd(month,2,getdate())),dateadd(month,2,getdate()))            /* 下月月底*/  
select dateadd(month,-1,getdate()) --取前一個月/上一個月

,case when DATEPART(weekday,accdate1)=7 then '星期六'  --計算星期幾
       when DATEPART(weekday,accdate1)=1 then '星期天'
      else '' end as '備注'
select * from u_dist_m where  DATEDIFF(DAY,createtime,GETDATE())<=15
--取最近15天的記錄
--取前推7天的請貨數,從昨天開始計算
select a.execdate
from u_distapply_m a,u_distapply_c b
where a.applyno=b.applyno and status=1
and convert(varchar(10),a.execdate,23) 
between convert(varchar(10),dateadd(day,-7,GETDATE()),23)
and convert(varchar(10),dateadd(day,-1,GETDATE()),23)

select * from u_distapply_m a where  --按時間段查詢數據,在存儲過程動態報表中常用
a.execdate between '2017-10-12' and dateadd(ms,-3,dateadd(dd,1,'2017-10-13'))

select @day = DATEPART(dd,getdate()) --取日期號數                             
--逢會員日,打折,不積分             
if  @day in(8,18,28)
select   filename   from   master.dbo.sysdatabases   where   name   =   '數據庫名' --查看數據庫文件存放位置
DATEDIFF(dd,CONVERT(varchar(12),createtime,23),getdate())>=7 --大於當前日期天含天的日記錄
select stamp+0 from u_dist_m where distno='單號' --取時間戳
select wareid,stamp+0,DATEADD(second,stamp+0+ 8 * 3600,'2013-01-01 00:00:00') from u_ware_q where wareid='110160' –時間戳轉日期
select a.wareid,b.warename from hydee_2004..u_ware_q a,hydee_連鎖..u_ware_q b where a.wareid=b.wareid  --取不同數據庫的表數據

sql中,兩個比較函數用法:都可生成排序用1、ROW_NUMBER() over(order by wareid)
2IDENTITY(bigint)

--OPENQUERY 的用法:
OPENQUERY (linked_server, "INSERT INTO msgs(...) VALUES(...)");以上做法是不正確的,
正確做法如下:
SELECT 示例:SELECT * FROM OPENQUERY (linked_server, "SELECT * FROM msgs");
INSERT 示例:INSERT OPENQUERY ([192.168.0.200], 'SELECT title, content FROM msgs') VALUES ('title', 'content');
UPDATE 示例:UPDATE OPENQUERY ([192.168.0.200], 'SELECT title, content FROM msgs WHERE id=1') SET title = 'newTitle',content = 'newContent';
DELETE 示例:DELETE OPENQUERY ([192.168.0.200], 'SELECT id FROM msgs WHERE id=1');
--跨服務器更新數據
set quoted_identifier off
go
declare @warename varchar(20)
set @warename='測試商品名'
UPDATE OPENQUERY ([192.168.0.200], "select warename from hydee_fst..d_ware0209 where wareid='100000'") SET warename=@warename;

注意OPENQUERY 不接受參數變量,也就是說:DELETE OPENQUERY ([192.168.0.200], 'SELECT id FROM msgs WHERE id=' + @id); 
是不正確的,但可以這樣做:DELETE OPENQUERY ([192.168.0.200], 'SELECT id FROM msgs') WHERE id=@id); 。
T-SQL 中,INSERT 可以省略 INTODELETE 也可以省略 FROMINSERT 時必須明確 SELECT 的字段。

 


免責聲明!

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



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