創建表

--刪除表 --DROP TABLE [dbo].[Test] --創建表 CREATE TABLE [dbo].[Test] ( [Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, ----自增主鍵 [Name] nvarchar(50) NULL DEFAULT '默認值', ----可設置默認值 [Remarks] nvarchar(MAX) NULL, --------------------字符串類型 [TypeId] int NULL,-------------------------------整型,取值范圍[-231~231) [ServicevalueExcludingVat] MONEY NULL, ----------貨幣型 [ServicevalueEncludingVat] decimal(12,4) NULL, --精確數值型 共12位,小數點右4位 [VatPercentage] float NULL, ---------------------近似數值型 [AddDate] date NULL , ------------------------------日期 [AddTime] datetime NULL ,---------------------------時間 ) --添加表說明 EXECUTE sp_addextendedproperty N'MS_Description',N'測試表',N'user',N'dbo',N'table',N'Test',NULL,NULL --刪除表說明 --EXEC sp_dropextendedproperty N'MS_Description','user','dbo','table', '表名', NULL,NULL --添加字段說明 EXECUTE sp_addextendedproperty N'MS_Description',N'名稱',N'user',N'dbo',N'table',N'Test',N'column',N'Name' EXECUTE sp_addextendedproperty N'MS_Description',N'備注',N'user',N'dbo',N'table',N'Test',N'column',N'Remarks' EXECUTE sp_addextendedproperty N'MS_Description',N'類型',N'user',N'dbo',N'table',N'Test',N'column',N'TypeId' EXECUTE sp_addextendedproperty N'MS_Description',N'服務價值,不包括增值稅',N'user',N'dbo',N'table',N'Test',N'column',N'ServicevalueExcludingVat' EXECUTE sp_addextendedproperty N'MS_Description',N'服務價值,包括增值稅',N'user',N'dbo',N'table',N'Test',N'column',N'ServicevalueEncludingVat' EXECUTE sp_addextendedproperty N'MS_Description',N'增值稅百分比',N'user',N'dbo',N'table',N'Test',N'column',N'VatPercentage' EXECUTE sp_addextendedproperty N'MS_Description',N'創建日期',N'user',N'dbo',N'table',N'Test',N'column',N'AddDate' EXECUTE sp_addextendedproperty N'MS_Description',N'創建時間',N'user',N'dbo',N'table',N'Test',N'column',N'AddTime' --刪除字段說明 --EXEC sp_dropextendedproperty N'MS_Description', 'user','dbo', 'table', '表名', 'column','字段名'

DECLARE @TAB TABLE ( [Name] nvarchar(50) NULL, ----可設置默認值 [Remarks] nvarchar(MAX) NULL, --------------------字符串類型 [TypeId] int NULL,-------------------------------整型,取值范圍[-231~231) [ServicevalueExcludingVat] MONEY NULL, ----------貨幣型 [ServicevalueEncludingVat] decimal(12,4) NULL, --精確數值型 共12位,小數點右4位 [VatPercentage] float NULL, ---------------------近似數值型 [AddDate] date NULL , ------------------------------日期 [AddTime] datetime NULL ---------------------------時間 ) DECLARE @i int SET @i = 1 WHILE @i<= 100000 BEGIN INSERT INTO @TAB VALUES( ABS(CHECKSUM(newid())%900000)+100000,NEWID(), CONVERT(int,RAND()*10)+1, CONVERT(MONEY,RAND()*1000), CONVERT(decimal(12,4),RAND()*1000), CONVERT(decimal(12,2),RAND()*100), DATEADD(dd, CONVERT(int,RAND()*1000), '2015-01-01'), DATEADD(dd, CONVERT(int,RAND()*1000), '2015-01-01')) SET @i = @i + 1 END INSERT INTO [Test]([Name],[Remarks],[TypeId],[ServicevalueExcludingVat],[ServicevalueEncludingVat],[VatPercentage],[AddDate],[AddTime]) SELECT [Name],[Remarks],[TypeId],[ServicevalueExcludingVat],[ServicevalueEncludingVat],[VatPercentage],[AddDate],[AddTime] FROM @TAB

--單列索引(非聚集索引) CREATE INDEX [索引名稱] ON [表名] ([字段1]) --唯一索引(非聚集索引) CREATE UNIQUE INDEX [索引名稱] ON [表名] ([字段1]) --復合索引(非聚集索引) CREATE UNIQUE NONCLUSTERED INDEX [索引名稱] ON [表名]([字段1],[字段2]) --刪除索引 DROP INDEX [索引名稱] ON [表名] --查詢索引 SELECT CASE WHEN t.[type] = 'U' THEN '表' WHEN t.[type] = 'V' THEN '視圖' END AS '類型', SCHEMA_NAME( t.schema_id ) + '.' + t.[name] AS '(表/視圖)名稱', i.[name] AS 索引名稱, SUBSTRING ( column_names, 1, LEN( column_names ) - 1 ) AS '列名', CASE WHEN i.[type] = 1 THEN '聚集索引' WHEN i.[type] = 2 THEN '非聚集索引' WHEN i.[type] = 3 THEN 'XML索引' WHEN i.[type] = 4 THEN '空間索引' WHEN i.[type] = 5 THEN '聚簇列存儲索引' WHEN i.[type] = 6 THEN '非聚集列存儲索引' WHEN i.[type] = 7 THEN '非聚集哈希索引' END AS '索引類型', CASE WHEN i.is_unique = 1 THEN'唯一' ELSE '不唯一' END AS '索引是否唯一' FROM sys.objects AS t INNER JOIN sys.indexes AS i ON t.object_id = i.object_id CROSS APPLY ( SELECT col.[name] + ', ' FROM sys.index_columns AS ic INNER JOIN sys.columns AS col ON ic.object_id = col.object_id AND ic.column_id = col.column_id WHERE ic.object_id = t.object_id AND ic.index_id = i.index_id ORDER BY col.column_id FOR XML PATH ( '' ) ) D ( column_names ) WHERE t.is_ms_shipped <> 1 AND index_id > 0 ORDER BY i.[name];
查詢表結構【示例圖】

--查詢表結構 CREATE PROC [dbo].[aaa_select_table] --創建存儲過程 @name nvarchar(50) as begin --開始 declare @condition nvarchar(2000); set @condition=' where 1=1 '; if(@name<>'') set @condition=@condition+' and d.name like ''%'+@name+'%'''; exec(' SELECT 表名=case when a.colorder=1 then d.name else '''' end, 表說明=case when a.colorder=1 then isnull(f.value,'''') else '''' end, 字段序號=a.colorder, 字段名=a.name, 字段說明=isnull(g.[value],''''), 類型=b.name, 長度=COLUMNPROPERTY(a.id,a.name,''PRECISION''), 標識=case when COLUMNPROPERTY( a.id,a.name,''IsIdentity'')=1 then ''√''else '''' end, 主鍵=case when exists(SELECT 1 FROM sysobjects where xtype=''PK'' and name in ( SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid ))) then ''√'' else '''' end, 允許空=case when a.isnullable=1 then ''√''else '''' end, 默認值=isnull(e.text,'''') FROM syscolumns a left join systypes b on a.xusertype=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 sys.extended_properties g on a.id=g.major_id and a.colid=g.minor_id left join sys.extended_properties f on d.id=f.major_id and f.minor_id=0 '+@condition+' order by a.id,a.colorder '); end;--結束
基本sql語句
插入:INSERT INTO [表名] VALUES('value1','value2') INSERT INTO [表名]([字段1],[字段2]) VALUES('value1','value2') INSERT INTO [表名]([字段1],[字段2]) SELECT [字段1],[字段2] FROM [表名] 復制:SELECT * INTO 目標表名 FROM 源表名 WHERE 1=2 (【復制表結構】即:讓WHERE條件不成立) SELECT * INTO 目標表名 FROM 源表名(【復制表結構及數據】要求目標表不存在,因為在插入時會自動創建) 刪除表:DROP TABLE [表名] 刪除數據:DELETE FROM [表名] WHERE 范圍 清空:TRUNCATE TABLE [表名] 更新:UPDATE [表名] SET [字段]='value1' WHERE 范圍 替換:UPDATE [表名] SET [字段] = REPLACE([字段], '替換前內容', '替換后內容'); 選擇:SELECT * FROM [表名] WHERE 范圍 查找:SELECT * FROM [表名] WHERE [字段] LIKE '%value1%' 排序:SELECT * FROM [表名] ORDER BY [字段1] ASC,[字段2] DESC 總數:SELECT COUNT(*) AS TotalCount FROM [表名] 求和:SELECT SUM([字段]) AS SumValue FROM [表名] 平均:SELECT AVG([字段]) AS AvgValue FROM [表名] 最大:SELECT MAX([字段]) AS MaxValue FROM [表名] 最小:SELECT MIN([字段]) AS MinValue FROM [表名] --添加主鍵 ALTER TABLE 表名 ADD CONSTRAINT 主鍵名 PRIMARY KEY(字段); --修改字段名 (注意: 更改對象名的任一部分都可能會破壞腳本和存儲過程) EXEC SP_RENAME '表名.字段名','新字段名' --修改字段類型: ALTER TABLE 表名 ALTER COLUMN 字段名 INT NOT NULL --增加字段 ALTER TABLE 表名 ADD 字段名 INT NOT NULL --刪除字段 ALTER TABLE 表名 DROP COLUMN 字段名;
外連接
--外連接 A、left join: 左外連接(左連接):結果集幾包括連接表的匹配行,也包括左連接表的所有行。 B:right join: 右外連接(右連接):結果集既包括連接表的匹配連接行,也包括右連接表的所有行。 C:join: 全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
高級查詢運算詞
A: UNION 運算符 UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重復行而派生出一個結果表。當 ALL 隨 UNION一起使用時(即 UNION ALL),不消除重復行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。 B: EXCEPT 運算符 EXCEPT 運算符通過包括所有在 TABLE1 中但不在 TABLE2 中的行並消除所有重復行而派生出一個結果表。當 ALL 隨 EXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。 C: INTERSECT 運算符 INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALL 隨 INTERSECT 一起使用時 (INTERSECT ALL),不消除重復行。 注:使用運算詞的幾個查詢結果行必須是一致的。
常用查詢
1:查詢重復數據

select * from table1 a where field1 in (select field1 from table1 group by field1 having count(*) > 1)
2:自增序號

SELECT row_number () OVER (ORDER BY Id) AS '序號',* FROM table1
3:星期幾

set language N'Simplified Chinese' select datename(weekday, getdate()) select datename(dw, getdate())
常用函數
參考鏈接:https://www.w3cschool.cn/wqf_database/

--char(9) 水平制表符 print 'A'+char(9)+'B' --char(10)換行鍵 print 'A'+char(10)+'B' --char(13)回車鍵 print 'A'+char(13)+'B'

--ASCII() 返回字符表達式最左端字符的ASCII 碼值。在ASCII()函數中,純數字的字符串可不用‘’括起來,但含其它字符的字符串必須用‘’括起來使用,否則會出錯。 SELECT ASCII('A') --CHAR() 將ASCII 碼轉換為字符。如果沒有輸入0 ~ 255 之間的ASCII 碼值,CHAR() 返回NULL 。 SELECT CHAR(65) --LOWER() 將字符串全部轉為小寫 SELECT LOWER('ABC') --UPPER() 將字符串全部轉為大寫。 SELECT UPPER('abc') --STR() 將數字轉換為字符串的快捷函數 , 函數有3個參數:數值、總長度和小數位數 SELECT STR(123.4, 8, 4)

--LTRIM() 把字符串頭部的空格去掉。 SELECT LTRIM(' ABC') --RTRIM() 把字符串尾部的空格去掉。 SELECT RTRIM('ABC ')

--LEFT() 返回字符串左起*個字符。 SELECT LEFT('ABCDEFG',3) --RIGHT() 返回字符串右起*個字符。 SELECT RIGHT('ABCDEFG',3) --SUBSTRING() 返回從字符串左邊第*個字符起*個字符的部分。 SELECT SUBSTRING('ABCDEFG',3,2)

--CHARINDEX() 返回字符串中某個指定的子串出現的開始位置。如果沒有發現子串,則返回0 值。不能用於TEXT 和IMAGE 數據類型。 SELECT CHARINDEX('C','ABCDEFG') --PATINDEX() 返回字符串中某個指定的子串出現的開始位置。可以使用通配符 SELECT PATINDEX('%B_D%','ABCDEFG')

--QUOTENAME() 返回被特定字符括起來的字符串。給輸入的字符串加一對方括號,並返回新形成的字符串 SELECT QUOTENAME('ABCDEFG','[]') --輸出結果:[ABCDEFG] --REPLICATE() 返回一個重復指定次數的字符串。 SELECT REPLICATE('ABC|',3) --輸出結果:ABC|ABC|ABC| --REVERSE() 將指定的字符串的字符排列順序顛倒。 SELECT REVERSE('ABCDEFG') --輸出結果:GFEDCBA --REPLACE() 返回被替換了指定子串的字符串。 SELECT REPLACE('ABCDEFG','ABC','XXXXX') --輸出結果:XXXXXDEFG --SPACE() 返回一個有指定長度的空白字符串。 SELECT 'A' + SPACE(5) + 'B' --輸出結果:A B --STUFF() 將字符串插入到另一個字符串中。它會刪除開始位置第一個字符串中的指定長度的字符,然后將第二個字符串插入到開始位置的第一個字符串中。 --STUFF(<character_expression>,<開始>,<長度>,<character_expression>) SELECT STUFF('ABCD', 2, 1, '|EFG|') --輸出結果:A|EFG|CD

CAST()函數的參數是一個表達式,它包括用AS關鍵字分隔的源值和目標數據類型 例:SELECT CAST('123' AS int) CONVERT() 函數是把日期轉換為新數據類型的通用函數。可以用不同的格式顯示日期/時間數據。 例:SELECT CONVERT(int, '123') 例:SELECT CONVERT(varchar(50) , GETDATE(), 23 ) --CAST()函數和CONVERT()函數都不能執行四舍五入或截斷操作 SELECT CAST('123.4' AS int) --在將 varchar 值 '123.4' 轉換成數據類型 int 時失敗。 SELECT CONVERT(int, '123.4') --在將 varchar 值 '123.4' 轉換成數據類型 int 時失敗。

AVG() --返回的平均價值 COUNT() --返回的總數 FIRST() --返回第一個值 LAST() --返回最后一個值 MAX() --返回的最大值 MIN() --返回最小值 TOTAL() --返回總和

DATEADD()函數用於在日期/時間值上加上日期單位間隔 例:SELECT DATEADD(yy, 1, '2019-01-01') 例:SELECT DATEADD(mm, 2, '2019-01-01') 例:SELECT DATEADD(dd, 30, '2019-01-01') DATEDIFF() 函數返回兩個日期之間的時間 例:SELECT DATEDIFF(yy,'2009-01-01','2019-01-01') 例:SELECT DATEDIFF(mm,'2019-01-01','2019-12-12') 例:SELECT DATEDIFF(dd,'2019-01-01','2019-01-30') DATEPART() 函數用於返回日期/時間的單獨部分,比如年、月、日、小時、分鍾等等。 例:SELECT DATEPART(yy,'2019-01-01') 例:SELECT DATEPART(mm,'2019-01-01') 例:SELECT DATEPART(dd,'2019-01-01')
自定義函數

CREATE FUNCTION [dbo].[Intercept] ( @String VARCHAR(MAX), @Delimiter VARCHAR(MAX) ) RETURNS @temptable TABLE ( [value] VARCHAR(MAX) ) AS BEGIN DECLARE @idx INT=1 DECLARE @slice VARCHAR(MAX) IF LEN(@String) < 1 OR LEN(ISNULL(@String,'')) = 0 RETURN WHILE @idx != 0 BEGIN SET @idx = CHARINDEX(@Delimiter,@String) IF @idx != 0 SET @slice = LEFT(@String,@idx - 1) ELSE SET @slice = @String IF LEN(@slice) > 0 INSERT INTO @temptable([value]) VALUES(@slice) SET @String = RIGHT (@String, LEN(@String) - @idx) IF LEN(@String) = 0 BREAK END RETURN END --執行 SELECT * FROM Intercept ('1,2,3,4,5,6,7,8,9',',')

CREATE FUNCTION [dbo].[Intercept2] ( @SplitString varchar(max), @Separator char(1) ) RETURNS @SplitStringsTable TABLE ( [id] int identity(1,1), [value] nvarchar(max) ) AS BEGIN DECLARE @CurrentIndex int; DECLARE @NextIndex int; DECLARE @ReturnText nvarchar(max); SELECT @CurrentIndex=1; WHILE(@CurrentIndex<=len(@SplitString)) BEGIN SELECT @NextIndex=charindex(@Separator,@SplitString,@CurrentIndex); IF(@NextIndex=0 OR @NextIndex IS NULL) SELECT @NextIndex=len(@SplitString)+1; SELECT @ReturnText=substring(@SplitString,@CurrentIndex,@NextIndex-@CurrentIndex); INSERT INTO @SplitStringsTable([value]) VALUES(@ReturnText); SELECT @CurrentIndex=@NextIndex+1; END RETURN; END --執行 SELECT * FROM Intercept2 ('1,2,3,4,5,6,7,8,9',',')

CREATE FUNCTION [dbo].[ConvertHex10To36] (@Hex10 INT) RETURNS VARCHAR(100) AS BEGIN declare @reminder int declare @decimalNum int= @Hex10+100000 declare @system int=36 declare @hexStr varchar(50)='' declare @baseStr varchar(36)='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' while @decimalNum>=@system begin set @reminder=@decimalNum%@system set @decimalNum=@decimalNum/@system set @hexStr=SUBSTRING(@baseStr,@reminder+1,1)+@hexStr end set @hexStr=SUBSTRING(@baseStr,@decimalNum+1,1)+@hexStr RETURN LEFT(@hexStr+'000000',6) END --執行 SELECT dbo.ConvertHex10To36('123456')

CREATE FUNCTION [dbo].[GetDayTime] ( @beginTime nvarchar(100), @endTime nvarchar(100) ) RETURNS @returntable TABLE ( DayTime nvarchar(100) ) AS BEGIN while(@beginTime<=@endTime) begin INSERT INTO @returntable (DayTime) SELECT @beginTime SELECT @beginTime = CONVERT(varchar(50),dateadd(day,1,@beginTime), 23 ) end; RETURN END --執行 SELECT * FROM GetDayTime ('2019-08-01','2019-08-31')

CREATE FUNCTION [dbo].[GetMonthTime] ( @beginTime nvarchar(100), @endTime nvarchar(100) ) RETURNS @returntable TABLE ( MonthTime nvarchar(100) ) AS BEGIN SET @beginTime = @beginTime + '-01'; SET @endTime = @endTime + '-01'; while(@beginTime<=@endTime) begin INSERT INTO @returntable (MonthTime) SELECT CONVERT(varchar(50),LEFT (CONVERT (VARCHAR ,@beginTime, 21),7)) SELECT @beginTime = CONVERT(varchar(50),LEFT (CONVERT (VARCHAR ,dateadd(mm, 1 ,@beginTime), 21),7))+ '-01' end; RETURN END --執行 SELECT * FROM GetMonthTime ('2019-01','2019-08')

CREATE FUNCTION [dbo].[GetYearTime] ( @beginTime nvarchar(100), @endTime nvarchar(100) ) RETURNS @returntable TABLE ( YearTime nvarchar(100) ) AS BEGIN SET @beginTime = @beginTime + '-01-01'; SET @endTime = @endTime + '-01-01'; while(@beginTime<=@endTime) begin INSERT INTO @returntable (YearTime) SELECT CONVERT (VARCHAR(4),YEAR(@beginTime)) SELECT @beginTime = CONVERT (VARCHAR(4),YEAR(dateadd(yy,1,@beginTime))) + '-01-01' end; RETURN END --執行 SELECT * FROM GetYearTime ('2015','2019')
其他

select * from table1 where time between time1 and time2 select a,b,c, from table1 where a not between 數值1 and 數值2

select top 10 * from tablename order by newid()

SELECT TOP 10 st.text AS [父級完整語句], SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) as [統計對應的部分語句], CAST( ((qs.total_elapsed_time / 1000000.0)/qs.execution_count) AS DECIMAL(28,2) ) AS [平均消耗秒數], CAST(qs.last_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成消耗秒數], qs.last_execution_time AS [最后執行時間], CAST(qs.min_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最小消耗秒數], CAST(qs.max_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最大消耗秒數], CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [總消耗秒數], (qs.execution_count) AS [總執行次數], creation_time AS [編譯計划的時間], CAST(qs.last_worker_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成占用CPU秒數] from sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp WHERE qs.last_execution_time>DATEADD(n,-30,GETDATE()) ORDER BY qs.last_worker_time DESC

USE [master] GO ALTER DATABASE 要清理的數據庫名稱 SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE 要清理的數據庫名稱 SET RECOVERY SIMPLE --簡單模式 GO USE 要清理的數據庫名稱 GO DBCC SHRINKFILE (N'要清理的數據庫名稱_log' , 2, TRUNCATEONLY) --設置壓縮后的日志大小為2M,可以自行指定 GO USE [master] GO ALTER DATABASE 要清理的數據庫名稱 SET RECOVERY FULL WITH NO_WAIT GO ALTER DATABASE 要清理的數據庫名稱 SET RECOVERY FULL --還原為完全模式 GO

-- 第一步:啟用 sql server 郵件的功能 exec sp_configure 'show advanced options', 1 go reconfigure with override go exec sp_configure 'Database Mail XPs', 1 go reconfigure with override go -- 第二步:查看數據庫郵件功能是否開啟,value 值為1表示已開啟,0為未開啟 select name,value,description,is_dynamic,is_advanced from sys.configurations where name like '%mail%' --第三步:創建郵件賬戶 if exists(SELECT * FROM msdb..sysmail_account WHERE NAME='Mail') --判斷郵件賬戶名為 test 的賬戶是否存在 begin EXEC msdb..sysmail_delete_account_sp @account_name='Mail' -- 刪除郵件賬戶名為 test 的賬戶 end exec msdb..sysmail_add_account_sp --創建郵件賬戶 @account_name = 'Mail' -- 郵件帳戶名稱 ,@email_address = '123456789@qq.com' -- 發件人郵件地址 ,@display_name = '系統' -- 發件人姓名 ,@replyto_address = null -- 回復地址 ,@description = null -- 郵件賬戶描述 ,@mailserver_name = 'smtp.qq.com' -- 郵件服務器地址 ,@mailserver_type = 'SMTP' -- 郵件協議 ,@port = 25 -- 郵件服務器端口 ,@username = '123456789@qq.com' -- 用戶名 ,@password = '*********' -- QQ郵箱POP3/SMTP服務 授權碼 ,@use_default_credentials = 0 -- 是否使用默認憑證,0為否,1為是 ,@enable_ssl = 1 -- 是否啟用 ssl 加密,0為否,1為是 PS:如果使用的是QQ郵箱,記得要把參數 @enable_ssl 的值設置為 1 ,@account_id = null -- 輸出參數,返回創建的郵件賬戶的ID --第四步:創建郵件配置文件 if exists(SELECT * FROM msdb..sysmail_profile where NAME = N'SendEmailProfile') --判斷名為 SendEmailProfile 的郵件配置文件是否存在 begin exec msdb..sysmail_delete_profile_sp @profile_name = 'SendEmailProfile' --刪除名為 SendEmailProfile 的郵件配置文件 end exec msdb..sysmail_add_profile_sp -- 添加郵件配置文件 @profile_name = 'SendEmailProfile', -- 配置文件名稱 @description = '數據庫發送郵件配置文件', -- 配置文件描述 @profile_id = NULL -- 輸出參數,返回創建的郵件配置文件的ID --第五步:郵件賬戶和郵件配置文件相關聯 exec msdb..sysmail_add_profileaccount_sp @profile_name = 'SendEmailProfile', -- 郵件配置文件名稱 @account_name = 'Mail', -- 郵件賬戶名稱 @sequence_number = 1 -- account 在 profile 中的順序,一個配置文件可以有多個不同的郵件賬戶 --第六步:發送測試郵件 EXEC msdb.dbo.sp_send_dbmail @profile_name=N'SendEmailProfile', --配置文件,就是前面配置好的 @recipients='123456789@qq.com', --收件箱(多個用;隔開) @subject ='同步失敗預警', -- 消息的主題 @body_format='HTML', --指定消息的格式,一般文本直接去掉即可,發送html格式的內容需加上 @body='', --消息主體 @query='select * FROM [Test].[dbo].[Course]', --查詢 @attach_query_result_as_file=1, --是否以附件發送 @query_attachment_filename='test.csv'; --附件文件名 --第七步:查詢郵件發送狀態 SELECT recipients, --收件人的電子郵件地址 subject, -- 消息的主題 body, --消息的正文。 body_format, --消息正文的格式。 可為 TEXT 和 HTML。 query, --郵件程序所執行的查詢 sent_date, --發送消息的日期和時間 sent_status --郵件的狀態 【sent】郵件已發送。 --【unsent】數據庫郵件仍在嘗試發送消息。 --【retrying】數據庫郵件無法發送消息,但正在嘗試再次發送。 --【failed】數據庫郵件無法發送消息。 FROM msdb.dbo.sysmail_allitems ORDER BY mailitem_id DESC

declare @tableHTML nvarchar(max) set @tableHTML = N'<H1>test for xml result</H1>' + N'<table border="1">' + N'<tr>' + N'<th> id </th>' + N'<th>Name</th>' + N'<th>IsDelete</th></tr>' + CAST(( select td=id,'', td=name,'', td=IsDelete,'' from ActivityType for xml path('tr'))as nvarchar(max)) +'</table>' SELECT @tableHTML

--“因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權”, --終解決方案如下 --關鍵SQL語句: ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE --用完之后再 ALTER database [datebase] set online

--查看被鎖表: SELECT request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName FROM sys.dm_tran_locks WHERE resource_type = 'OBJECT' ORDER BY request_session_id ASC -- 解鎖: DECLARE @spid INT SET @spid = 52 --鎖表進程 DECLARE @SQL VARCHAR (1000) SET @SQL = 'kill ' + CAST (@spid AS VARCHAR) EXEC (@SQL)

--查看執行時間和cpu占用時間 set statistics time on select * from dbo.Product set statistics time off --查看查詢對I/0的操作情況 set statistics io on select * from dbo.Product set statistics io off

SELECT a.name, a.[type],--P = SQL 存儲過程 V = 視圖 AF = 聚合函數 (CLR) b.[definition], a.create_date, --創建日期 a.modify_date --修改日期 FROM sys.all_objects a, sys.sql_modules b WHERE a.is_ms_shipped = 0 AND a.object_id = b.object_id AND a.[type] IN ('P', 'V', 'AF') ORDER BY a.[name] ASC

--查看當前庫中所有的觸發器和與之相對應的表: SELECT tb2.name AS '對應的表', tb1.name AS '觸發器', tb1.crdate AS '創建時間' FROM Sysobjects tb1 JOIN Sysobjects tb2 ON tb1.parent_obj = tb2.id WHERE tb1.type = 'TR'; --顯示觸發器的定義: EXEC sp_helptext 'UPDATE_Personnel_Staff_Changes';

BEGIN TRY SELECT 5 / 0 END TRY BEGIN CATCH SELECT ERROR_MESSAGE() AS '錯誤描述', ERROR_NUMBER() AS '錯誤號', ERROR_SEVERITY() AS '嚴重級別', ERROR_STATE() AS '錯誤狀態號', ERROR_LINE() AS '出錯的行號', ERROR_PROCEDURE() AS '發生錯誤的存儲過程名或觸發器名' END CATCH

BEGIN try BEGIN TRANSACTION --語句正確 UPDATE [Test] SET [MenuId]='11' WHERE [Id]='1' --MenuId為int類型,出錯 UPDATE [Test] SET [MenuId]='ABCD' WHERE [Id]='1' --語句正確 UPDATE [Test] SET [MenuId]='13' WHERE [Id]='1' SELECT ResponseNum = 1,Message = '保存成功' COMMIT TRANSACTION --事務已經成功執行,提交事務。 END try BEGIN catch SELECT ResponseNum = 0,Message = ERROR_MESSAGE() ROLLBACK TRANSACTION --數據處理過程中出錯,回滾到沒有處理之前的數據狀態 END catch

BACKUP DATABASE [數據庫名] TO DISK = N'C:\數據庫名.bak' WITH NOFORMAT, INIT, NAME = N'數據庫名', SKIP, REWIND, NOUNLOAD, STATS = 10

--DROP TABLE [dbo].[UserTree] CREATE TABLE [dbo].[UserTree] ( [Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, [Name] nvarchar(50) NULL, [ParentId] INT NULL, --父Id [Tree] nvarchar(MAX) NULL, --層級關系 [Level] INT NULL --層級 ) INSERT INTO [UserTree] VALUES (N'A', 0, N',', 1); INSERT INTO [UserTree] VALUES (N'B', 1, N',1,', 2); INSERT INTO [UserTree] VALUES (N'C', 2, N',1,2,', 3); INSERT INTO [UserTree] VALUES (N'D', 3, N',1,2,3', 4); INSERT INTO [UserTree] VALUES (N'E', 4, N',1,2,3,4,', 5); INSERT INTO [UserTree] VALUES (N'F', 5, N',1,2,3,4,5,', 6); INSERT INTO [UserTree] VALUES (N'G', 6, N',1,2,3,4,5,6,', 7); INSERT INTO [UserTree] VALUES (N'H', 7, N',1,2,3,4,5,6,7,', 8); INSERT INTO [UserTree] VALUES (N'I', 8, N',1,2,3,4,5,6,7,8,', 9); INSERT INTO [UserTree] VALUES (N'J', 9, N',1,2,3,4,5,6,7,8,9,', 10); INSERT INTO [UserTree] VALUES (N'AA', 0, N',', 1); INSERT INTO [UserTree] VALUES (N'BB', 11, N',11,', 2); INSERT INTO [UserTree] VALUES (N'CC', 12, N',11,12,', 3); INSERT INTO [UserTree] VALUES (N'DD', 13, N',11,12,13,', 4); INSERT INTO [UserTree] VALUES (N'EE', 14, N',11,12,13,14,', 5); INSERT INTO [UserTree] VALUES (N'FF', 15, N',11,12,13,14,15,', 6); INSERT INTO [UserTree] VALUES (N'GG', 16, N',11,12,13,14,15,16,', 7); INSERT INTO [UserTree] VALUES (N'HH', 17, N',11,12,13,14,15,16,17,', 8); INSERT INTO [UserTree] VALUES (N'II', 18, N',11,12,13,14,15,16,17,18,', 9); INSERT INTO [UserTree] VALUES (N'JJ', 19, N',11,12,13,14,15,16,17,18,19,', 10); SELECT * FROM UserTree DECLARE @Id int DECLARE @Tree nvarchar(MAX) DECLARE @UpLevel int DECLARE @DownLevel int SELECT @Id = id,@Tree = Tree,@UpLevel = [Level]-2,@DownLevel = [Level]+2 FROM UserTree WHERE Id = 14 --查找出A的下級用戶(所有) --SELECT * FROM UserTree WHERE patindex('%,'+CONVERT(varchar(50),@Id)+',%',Tree) >= 1 --查找出A的下級用戶(所有 方法二) WITH TreeLevel(Id,Name,ParentId) AS( SELECT Id,Name,ParentId from UserTree where Id = 1 UNION ALL SELECT a.Id,a.Name,a.ParentId FROM UserTree AS a,TreeLevel WHERE a.ParentId = TreeLevel.Id ) SELECT * FROM TreeLevel --查找出A的下級用戶(三級) SELECT * FROM UserTree WHERE patindex('%,'+CONVERT(varchar(50),@Id)+',%',Tree) >= 1 AND Level BETWEEN [Level] AND @DownLevel --查找出A的上級用戶(所有) --SELECT * FROM UserTree WHERE patindex('%,'+CONVERT(varchar(50),Id)+',%',@Tree) >= 1 --查找出A的上級用戶(三級) SELECT * FROM UserTree WHERE patindex('%,'+CONVERT(varchar(50),Id)+',%',@Tree) >= 1 AND [Level] BETWEEN @UpLevel AND Level

CREATE TABLE [dbo].[PhoneBook] ( [Id] int IDENTITY(1,1) NOT NULL, [Phone] nvarchar(100) NULL, --聯系電話 [CommunicationTime] datetime NULL --通訊時間 ) INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 01:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 02:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'15186452378', N'2020-06-02 03:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'15186452378', N'2020-06-02 04:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 05:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'15186452378', N'2020-06-02 06:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 07:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'18125634588', N'2020-06-02 08:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'18125634588', N'2020-06-02 09:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 10:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'18125634588', N'2020-06-02 11:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 12:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'15186452378', N'2020-06-02 13:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 14:00:00.000') INSERT INTO [dbo].[PhoneBook] ([Phone],[CommunicationTime]) VALUES ( N'13112345678', N'2020-06-02 15:00:00.000') SELECT * FROM PhoneBook SELECT CASE WHEN AA.num=1 THEN AA.Phone ELSE AA.Phone+'('+CASt(AA.num AS VARCHAR(4))+')' END AS '通訊記錄',AA.num AS '通訊次數',AA.CommunicationTime AS '最后聯系時間' FROM ( SELECT a.Phone ,COUNT(*) AS num,MAX(a.CommunicationTime) AS CommunicationTime FROM (SELECT ROW_NUMBER() OVER (PARTITION BY Phone ORDER BY CommunicationTime,Phone) AS num1,ROW_NUMBER() OVER (ORDER BY CommunicationTime,Phone) AS num2,* FROM PhoneBook ) a GROUP BY a.num2-a.num1,a.Phone,CONVERT(VARCHAR(10),a.CommunicationTime,120) ) AS AA ORDER BY AA.CommunicationTime
《轉發 推薦 點贊 收藏》
《《《 持續更新中..........》》》
drop table InHospitalControl