經典常用SQL語句大全


創建表

--刪除表
--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 中的行並消除所有重復行而派生出一個結果表。當 ALLEXCEPT 一起使用時 (EXCEPT ALL),不消除重復行。   
C: INTERSECT 運算符  
INTERSECT 運算符通過只包括 TABLE1 和 TABLE2 中都有的行並消除所有重復行而派生出一個結果表。當 ALLINTERSECT 一起使用時 (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'
\t\r\n等特殊字符
--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) 
字符轉換函數 ASCII()/CHAR()/LOWER()/UPPER()/STR()
--LTRIM() 把字符串頭部的空格去掉。
SELECT LTRIM('  ABC') 
--RTRIM() 把字符串尾部的空格去掉。
SELECT RTRIM('ABC  ') 
去空格函數 LTRIM()/RTRIM()
--LEFT()  返回字符串左起*個字符。
SELECT LEFT('ABCDEFG',3) 
--RIGHT()  返回字符串右起*個字符。
SELECT RIGHT('ABCDEFG',3) 
--SUBSTRING()  返回從字符串左邊第*個字符起*個字符的部分。
SELECT SUBSTRING('ABCDEFG',3,2) 
取子串函數 LEFT()/RIGHT()/SUBSTRING()
--CHARINDEX()  返回字符串中某個指定的子串出現的開始位置。如果沒有發現子串,則返回0 值。不能用於TEXT 和IMAGE 數據類型。
SELECT CHARINDEX('C','ABCDEFG') 
--PATINDEX()  返回字符串中某個指定的子串出現的開始位置。可以使用通配符
SELECT PATINDEX('%B_D%','ABCDEFG') 
字符串比較函數 CHARINDEX()/PATINDEX()
--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
字符串操作函數 QUOTENAME()/REPLICATE()/REVERSE()/REPLACE()/SPACE()/STUFF()
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 時失敗。
數據類型轉換函數 CAST()/CONVERT()
AVG()      --返回的平均價值
COUNT()    --返回的總數
FIRST()    --返回第一個值
LAST()     --返回最后一個值
MAX()      --返回的最大值
MIN()      --返回最小值
TOTAL()    --返回總和
統計函數 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')
日期函數 DATEADD()/DATEDIFF()/DATEPART()

 

 自定義函數

 

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')
10進制轉36進制(可用於邀請碼)
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  
between 限制查詢數據范圍
select top 10 * from tablename order by newid()  
隨機取出10條數據
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
檢測sql性能
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查詢結果轉Html table
--“因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權”,
--終解決方案如下
--關鍵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
檢測sql執行情況
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
TRY 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
sql 連續出現次數

 

 

 《轉發 推薦 點贊 收藏》

《《《 持續更新中..........》》》

drop table InHospitalControl


免責聲明!

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



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