查表大小正則表達式
sp_spaceused 表名
修改表名算法
ALTER TABLE table RENAME TO NEW_TABLE_NAME;
修改列名
不支持sql
ALTER TABLE table RENAME COLUMN OLD_COLUMN_NAME TO NEW_COLUMN_NAME
支持如下兩種方式數據庫
sp_rename 'change.Times','TIMES1','column' go -- 或者 EXEC sp_rename 'T_WeiBoHot.citme','ctime','column' go -- change是表名,times是原來的列名,times1是新的列名
修改列的數據類型服務器
ALTER TABLE dbo.T_Intervene_HistoryDBRate ALTER COLUMN rate REAL;
插入/刪除列session
ALTER TABLE table ADD COLUMN_NAME DATATYPE; go ALTER TABLE table DROP COLUMN COLUMN_NAME;
分區
建分區app
CREATE PARTITION FUNCTION [fq_function](tinyint) AS RANGE LEFT FOR VALUES (0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07) GO CREATE PARTITION SCHEME [fq_Scheme] AS PARTITION [fq_function] TO ([PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY]) GO
查詢某分區數據函數
SELECT * FROM dbo.T_monnewssource_FQTest WITH(NOLOCK) WHERE $PARTITION.fq31_function(fq_date) = 30;
查當天數據所在分區spa
SELECT $PARTITION.fq31_function(datediff(day,'2015-07-01',getdate())%31);
分區依據日誌
fq_date TINYINT DEFAULT (datediff(day,'2015-01-01',getdate())%(8)) -- 分區依據字段值從0~7,分區從1~8 -- 31個分區時,只保留7個分區 DECLARE @i TINYINT = 1,@j TINYINT = 25,@str VARCHAR(100) = ''; WHILE @i < 25 BEGIN SELECT @i = @i + 1; SELECT @str = @str + ',' + LTRIM(@j); IF @j = 31 BEGIN SELECT @j = 0 END SELECT @j = @j + 1; END SELECT STUFF(@str,1,1,'') AS strs;
觸發器
禁用觸發器:
ALTER TABLE trig_example DISABLE TRIGGER trig1
恢復觸發器:
ALTER TABLE trig_example ENABLE TRIGGER trig1
禁用某個表上的全部觸發器
ALTER TABLE 你的表 DISABLE TRIGGER all
啓用某個表上的全部觸發器
ALTER TABLE 你的表 enable TRIGGER all
禁用全部表上的全部觸發器
exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'
啓用全部表上的全部觸發器
exec sp_msforeachtable 'ALTER TABLE ? enable TRIGGER all'
查詢做業
select a.name,b.command from msdb.dbo.sysjobs a inner join msdb.dbo.sysjobsteps b on a.job_id = b.job_id where b.command like '%P_GZ_HeavyPaste_UpOrder%'; `
查詢過程
select a.name,b.text from sys.objects a inner join sys.syscomments b on a.object_id = b.id where a.type = 'P' and b.text like '%T_SEM_PostSnap%';
查詢觸發器
SELECT * FROM sys.objects WHERE type = 'tr';
查詢視圖
select * from sysobjects where xtype='V';
查看進程
SELECT PRO.spid ,DB_NAME(PRO.dbid) AS DBName ,PRO.program_name ,waitresource ,PRO.loginame AS LoginName ,DB.name AS DatabaseName ,PRO.[status] as ProcessStatus ,PRO.cmd AS Command ,PRO.last_batch AS LastBatch ,PRO.cpu AS Cpu ,PRO.physical_io AS PhysicalIo ,PRO.hostname ,SES.row_count AS [RowCount] ,STM.[text] AS SQLStatement FROM sys.sysprocesses AS PRO INNER JOIN sys.databases AS DB ON PRO.dbid = DB.database_id INNER JOIN sys.dm_exec_sessions AS SES ON PRO.spid = SES.session_id CROSS APPLY sys.dm_exec_sql_text(PRO.sql_handle) AS STM WHERE PRO.spid >= 50 -- Exclude system processes ORDER BY PRO.physical_io DESC ,PRO.cpu DESC go SELECT * FROM sys.sysprocesses AS pro CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sql WHERE pro.spid = 135
循環執行過程
DECLARE @i INT =1 WHILE @i=1 BEGIN EXEC @i=P_wenda_ExportQuestionDaily; --過程return 1 END
查看過程執行狀況
SELECT ISNULL(DBS.name, '') AS DatabaseName ,OBJECT_NAME(EPS.object_id, EPS.database_id) AS ObjectName ,EPS.cached_time AS CachedTime ,EPS.last_elapsed_time AS LastElapsedTime ,EPS.execution_count AS ExecutionCount ,EPS.total_worker_time / EPS.execution_count AS AvgWorkerTime ,EPS.total_elapsed_time / EPS.execution_count AS AvgElapsedTime ,(EPS.total_logical_reads + EPS.total_logical_writes) / EPS.execution_count AS AvgLogicalIO FROM sys.dm_exec_procedure_stats AS EPS LEFT JOIN sys.databases AS DBS ON EPS.database_id = DBS.database_id ORDER BY AvgWorkerTime DESC;
查看開銷較大過程
SELECT ss.SUM_execution_count , t.text , ss.SUM_total_elapsed_time , ss.sum_total_worker_time , ss.sum_total_logical_reads , ss.sum_total_logical_writes FROM ( SELECT S.plan_handle , SUM(s.execution_count) SUM_Execution_count , SUM(s.total_elapsed_time) SUM_total_elapsed_time , SUM(s.total_worker_time) SUM_total_worker_time , SUM(s.total_logical_reads) SUM_total_logical_reads , SUM(s.total_logical_writes) SUM_total_logical_writes FROM sys.dm_exec_query_stats s GROUP BY S.plan_handle ) AS ss CROSS APPLY sys.dm_exec_sql_text(ss.plan_handle) t ORDER BY sum_total_logical_reads DESC
full join
SELECT (CASE WHEN A.customerId IS NULL THEN B.customerId ELSE A.customerId END) AS customerId, A.itemMoney AS currentNum, B.itemMoney AS frontNum INTO #W FROM #CA AS A FULL JOIN (SELECT customerId, itemMoney FROM #CA WHERE customerType = 2) AS B ON A.customerId = B.customerId WHERE A.customerType = 1 go SELECT (CASE WHEN W.customerId IS NULL THEN C.customerId ELSE W.customerId END) AS customerId, W.currentNum, W.frontNum, C.itemMoney AS lastYearNum INTO #WW FROM #W AS W FULL JOIN (SELECT customerId, itemMoney FROM #CA WHERE customerType = 3) AS C ON W.customerId = C.customerId go
cross apply
SELECT F.usergroupid, F.row, S.Element FROM dbo.T_Cabin_FeatureWords AS F CROSS APPLY dbo.ufn_split(row, '-') AS S WHERE usergroupid = 21
merge
MERGE dbo.T_I8_CommentGroup AS A USING (SELECT @e_id AS id) AS B ON A.ug_id = B.id WHEN MATCHED THEN UPDATE SET ug_useflag = @ug_useflag, os_depict = @os_depict WHEN NOT MATCHED THEN INSERT (ug_id, ug_useflag, os_depict, lasttime) VALUES (@e_id, @ug_useflag, @os_depict, CONVERT(VARCHAR(10), GETDATE() - 7, 121)) go MERGE dbo.T_I8_CommentUserGroup AS A USING ( SELECT @e_id AS id, B.col FROM dbo.f_split(@ug_ids,',') AS B WHERE B.col > '' )AS C ON A.e_id = C.id AND A.ug_id = CONVERT(INT, C.col) WHEN NOT MATCHED THEN INSERT (e_id, ug_id) VALUES (C.id, C.col) WHEN NOT MATCHED BY SOURCE AND A.e_id = @e_id THEN DELETE go
建立惟一索引並忽略重複值(已有的)
CREATE UNIQUE INDEX idx_temp_id ON dbo.temp_lxc (id) WITH(IGNORE_DUP_KEY = ON);
刪除索引語句
DROP INDEX sy ON salary;
SELECT 字段名錶 FROM 表名錶 WITH (INDEX(索引名)) WHERE 查詢條件;
建全文索引
開啓全文索引
execute sp_fulltext_database 'enable';
定義全文索引目錄(fulltext_bbsBoard_PostDay)
EXEC [sys].[sp_fulltext_catalog] @ftcat = 'fulltext_bbsBoard_PostDay', -- sysname @action = 'create', -- varchar(20) @path = N'D:\fulltext' -- nvarchar(101)
爲表[T_bbsBoard_PostDay]建立全文索引 可索引列爲 id
EXEC [sys].[sp_fulltext_table] @tabname = N'T_bbsBoard_PostDay', -- nvarchar(517) @action = 'create', -- varchar(50) @ftcat = fulltext_bbsBoard_PostDay, -- sysname @keyname = PK__T_bbsBoa__521F78666482D9EB -- sysname
設置全文索引列名
EXEC [sys].[sp_fulltext_column] @tabname = N'T_bbsBoard_PostDay', -- nvarchar(517) @colname = title, -- sysname @action = 'add', -- varchar(20) @language = 2052 -- int 2057 is the LCID for 英語 1033 :美語 2052:中文
激活索引
EXEC [sys].[sp_fulltext_table] @tabname = N'T_bbsBoard_PostDay', -- nvarchar(517) @action = 'activate'
填充索引,首次建立徹底文索引以後先徹底填充索引,把數據所有放入全文索引裏
ALTER FULLTEXT INDEX ON dbo.T_bbsBoard_PostDay SET CHANGE_TRACKING OFF GO ALTER FULLTEXT INDEX ON dbo.T_bbsBoard_PostDay START FULL POPULATION GO
修改填充方式爲自動跟蹤更改,等數據有變化的時候只須要把變化的部分填充進去全文索引裏
ALTER FULLTEXT INDEX ON dbo.T_bbsBoard_PostDay SET CHANGE_TRACKING AUTO GO
WHERE CONTAINS(Title,'華爲 and/or 聯想')
建惟一約束
ALTER TABLE T_WenDa_QuestionZFM ADD CONSTRAINT un_QuestionZFM_autoid UNIQUE(autoid); go ALTER TABLE dbo.T_MS_TopicBlackList ADD CONSTRAINT pk_TopicBlackList_topicid PRIMARY KEY (topic_id);
刪約束
ALTER TABLE dbo.T_SEM_TriLo DROP CONSTRAINT DF__T_SEM_Tri__ji_fl__4262CC11;
爲已有列添加默認值
ALTER TABLE dbo.T_SEM_ShowJsonShotSnap ADD CONSTRAINT ShowJsonShotSnap_defualt_rgNum DEFAULT(0) FOR rgNum;
顯示年月日部分:
convert(nvarchar(10), date1, 21)
取得該月第一天:
DATEADD(DD, -DAY(GETDATE()) + 1, GETDATE())
取得該月最後一天:
DATEADD(DD, -DAY(GETDATE()), DATEADD(MM, 1, GETDATE()))
返回插入到標識列中的值(SCOPE_IDENTITY/IDENT_CURRENT/@@IDENTITY)
返回插入數據條數使用 @@ROWCOUNT
CREATE TABLE #A(id INT); INSERT INTO dbo.tongxuelu ( t_name, t_sex, t_age ) OUTPUT INSERTED.t_id INTO #A SELECT 'abc','女',0;
遍歷
; WITH SUB(id, fid, word, paths,layer,word_id) AS ( SELECT C.cls_id,C.cls_fid,C.cls_path_word,C.cls_path_wordstr,C.cls_layer,C.cls_path_id FROM QADATA.dbo.T_QA_Class AS C WITH(NOLOCK) WHERE C.cls_id = 868163 UNION ALL SELECT C.cls_id,C.cls_fid,C.cls_path_word,C.cls_path_wordstr,C.cls_layer,C.cls_path_id FROM SUB AS S INNER JOIN QADATA.dbo.T_QA_Class AS C WITH(NOLOCK) ON S.id = C.cls_fid ) SELECT * FROM SUB ORDER BY layer ASC;
NEWID()
組內排序
ROW_NUMBER() OVER(PARTITION BY A.Url ORDER BY A.Utime DESC) AS n
哈希排重(MD5)
SELECT CONVERT(UNIQUEIDENTIFIER,HASHBYTES('MD5','LXC')); SELECT @titlehash = CONVERT(UNIQUEIDENTIFIER,HASHBYTES('md5', SUBSTRING( ISNULL(@title, ''),1,255))); contenthash = CONVERT(UNIQUEIDENTIFIER , HASHBYTES('md5',LEFT(RTRIM(LTRIM(@content)),4000))
拼接字符串
SELECT t_type + ',' FROM #toolList FOR XML PATH(''); go CREATE TABLE #words(id INT,word NVARCHAR(8)); INSERT INTO #words( id,word ) SELECT 1,'過去' UNION SELECT 1,'如今' UNION SELECT 1,'未來' UNION SELECT 2,'過去2' UNION SELECT 3,'如今3' UNION SELECT 2,'未來2' SELECT * FROM #words; DECLARE @a NVARCHAR(max); SELECT @a = STUFF((SELECT '|' + word FROM #words FOR XML PATH('')),1,1,''); SELECT @a; go SELECT B.id,STUFF((SELECT '|' + word FROM #words AS A WHERE A.id = B.id FOR XML PATH('')),1,1,'') FROM #words AS B GROUP BY B.id DROP TABLE #words; CREATE TABLE #temp(id INT); INSERT INTO #temp ( id ) SELECT 1 UNION SELECT 2 UNION SELECT 3; SELECT STUFF((SELECT ',' + LTRIM(id) FROM #temp FOR XML PATH('')),1,1,''); DROP TABLE #temp;
平均分配(個數/時間)
CREATE TABLE #temp(id INT,iname VARCHAR(10)); INSERT INTO #temp( id, iname ) SELECT 1,'a' UNION SELECT 2,'b' UNION SELECT 3,'c' SELECT * FROM #temp; SELECT * FROM #temp AS t,dbo.Nums AS n WHERE n.n <= CEILING(10*1.0/3); DECLARE @endTime DATETIME = GETDATE() + 1; SELECT *,DATEADD(MINUTE,(id-1) * DATEDIFF(MINUTE,GETDATE(),@endTime) / 4,GETDATE()) FROM #temp
計算某詞在串中出現個數
DECLARE @str VARCHAR(100)= 'a,b,c,d' SELECT @str SELECT LEN(@str) - LEN(REPLACE(@str, 'a', ''))
構造日期表
SELECT CAST(GETDATE()-number AS DATE) AS time FROM master..spt_values WHERE type='P' AND number<30
構造遞增表
SELECT number FROM master..spt_values WHERE type = 'P' AND number < 24
判斷字符串是不是純數字或字母
-- 純數字: ISNUMERIC(title) = 1 -- 純數字: PATINDEX('%[^0-9]%','12324') = 0 -- 純英文: PATINDEX('%[^a-z]%','abc') = 0 --- 不含漢字和字母: PATINDEX('%[吖-咗a-zA-Z]%',Title) = 0 -- 不含漢字: PATINDEX('%[吖-咗]%',title) = 0
正則表達式
獲取字符串中的英文字符
declare @str varchar(100) set @str='xyz123z5' select dbo.regexReplace(@str,'[^a-zA-Z]','',1,1)
獲取字符串中的英文字符長度
declare @str varchar(100) set @str='xyz123z5' select len(dbo.regexReplace(@str,'[^a-zA-Z]','',1,1))
語句塊例子:
create function dbo.regexReplace ( @source varchar(5000), --原字符串 @regexp varchar(1000), --正則表達式 @replace varchar(1000), --替換值 @globalReplace bit = 0, --是不是全局替換 @ignoreCase bit = 0 --是否忽略大小寫 ) returnS varchar(1000) AS begin declare @hr integer declare @objRegExp integer declare @result varchar(5000) exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace IF @hr <> 0 begin exec @hr = sp_OADestroy @objRegExp return null end exec @hr = sp_OADestroy @objRegExp IF @hr <> 0 begin return null end return @result end GO
建立數據庫
create database stuDB on primary -- 默認就屬於primary文件組,可省略 ( /*--數據文件的具體描述--*/ name='stuDB_data', -- 主數據文件的邏輯名稱 filename='D:\stuDB_data.mdf', -- 主數據文件的物理名稱 size=5mb, --主數據文件的初始大小 maxsize=100mb, -- 主數據文件增加的最大值,不限制的話可用「unlimited」 filegrowth=15%--主數據文件的增加率,也可指定大小 ) log on ( /*--日誌文件的具體描述,各參數含義同上--*/ name='stuDB_log', filename='D:\stuDB_log.ldf', size=2mb, filegrowth=1mb --也可用增加率 )
一個數據庫中,只能夠有一個 主數據文件(擴展名: .mdf),多個次數據文件(擴展名: .ndf),多個日誌文件(擴展名: .Ldf);
多文件及文件組示例:
CREATE DATABASE Sales ON PRIMARY ( NAME = SPri1_dat, FILENAME = 'D:\SalesData\SPri1dat.mdf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ), ( NAME = SPri2_dat, FILENAME = 'D:\SalesData\SPri2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15% ), FILEGROUP SalesGroup1 ( NAME = SGrp1Fi1_dat, FILENAME = 'D:\SalesData\SG1Fi1dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), ( NAME = SGrp1Fi2_dat, FILENAME = 'D:\SalesData\SG1Fi2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), FILEGROUP SalesGroup2 ( NAME = SGrp2Fi1_dat, FILENAME = 'D:\SalesData\SG2Fi1dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ), ( NAME = SGrp2Fi2_dat, FILENAME = 'D:\SalesData\SG2Fi2dt.ndf', SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5 ) LOG ON ( NAME = Sales_log, FILENAME = 'E:\SalesLog\salelog.ldf', SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB ) ; GO
關閉/開啓 Transact-SQL 語句或存儲過程影響的行計數的消息
SET NOCOUNT ON go SET NOCOUNT OFF go SET NOCOUNT ON
開啓/關閉自增列
顯示值插入(修改會話中的IDENTITY_INSERT ),臨時性 ,不完全改表列性質
SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }
查服務器名
SELECT @@SERVERNAME;
頁面沒法執行過程時,環境設置
SET ANSI_WARNINGS ON; SET ANSI_PADDING ON; SET CONCAT_NULL_YIELDS_NULL ON;
鎖
查死鎖
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' AND OBJECT_NAME(resource_associated_entity_id) = 'MonNews_floors_ContentText'; select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'; select top 100* from master..sysprocesses a cross apply sys.dm_exec_sql_text(a.sql_handle) b where a.spid>50 AND b.text LIKE '%T_bbsBoard_PostDay%' order by hostname; select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT;
解鎖
declare @spid int Set @spid = 57 --鎖表進程 declare @sql varchar(1000) set @sql='kill '+cast(@spid as varchar) exec(@sql)
檢索死鎖進程
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name from sysprocesses where spid in (select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)
表A數據量很大,現須要保留表A的少許數據
刪除A耗時長並且會增長數據庫負載,能夠考慮更換表名的方法達到目的
假設表A有自增id
1).新建與表 A 結構相同的表 B;
2).中止表 A 的做業修改過程 讓表A數據再也不變化;
3).將 表 A 要保留數據 指定相同自增id 插入 表 B;
SET IDENTITY_INSERT B ON INSERT B SELECT ... FROM A WHERE ... SET IDENTITY_INSERT B OFF
4).指定 表 B 自增id;
查詢 表 A 自增id當前值DBCC CHECKIDENT (A)
;
指定表 B 爲 與 表 A 同樣的新值DBCC CHECKIDENT (B, RESEED, value)
;
5).重命名的方式到達 備份刪除目的;
EXEC sp_rename A,A1 EXEC sp_rename B,A
查詢相鄰兩條記錄間的數據增長或減小值
經過查詢原來的數據庫,創建兩個臨時表。臨時表中添加一個字段做爲順序標籤。
第一個臨時表中順序標籤是0開始,第二個臨時表從1開始。而後兩個表直接經過順序標籤這一列進行內聯,這樣不就能直接計算增量值了啊。在查詢的時候還能直接把其餘相關的時間等信息都帶出來。
注意,這樣是讓兩個表格對應錯位,以便求增量,因此兩個臨時表中都有一行在內聯中丟失掉。