常用SQL


日志查詢

SELECT
    TOP 100 a.CreateTime AS '運行時間',
    --b.p_id,
    --a.Login_UserId AS '操作人id',
    a.Login_UserName AS '操作人姓名',
    b.p_remark AS 'sql方法',
    a.SqlName AS 'SQL名',
    a.SqlContent AS '運行SQL內容',
    a.ErrorPrompt AS '錯誤提示'
    --b.p_sql AS 'SQL',
    --a.Source AS '來源',
    --a.CreatePeople AS '主機名'
FROM
    System_Log AS a
LEFT JOIN PrintSql AS b ON b.p_name = a.SqlName
WHERE
    1 = 1
AND b.p_remark NOT IN ('未同步數據','查詢session_zj')
AND DateDiff(dd, a.CreateTime, getdate()) = 0
--AND b.p_name LIKE '%insert_Order_OrderInfo_OneAndMany%'
ORDER BY
    a.CreateTime DESC;

SELECT COUNT(*) FROM System_Log WHERE DateDiff(dd, CreateTime, getdate()) = 0;
日志查詢
UPDATE [dbo].[PrintSql] SET [p_sql]=N' ' WHERE ([p_id]='999')
修改sql

 創建表

--刪除表
--DROP TABLE [dbo].[System_Code_InstallationPeriod]


--創建表
CREATE TABLE [dbo].[System_Code_InstallationPeriod] (
[Id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
[Name] nvarchar(50) NULL  DEFAULT '默認值', 
[TypeId] INT NULL,
[Money] money NULL,
[CreatePeople] nvarchar(50) NULL ,
[CreateTime] datetime NULL ,
[ModifyPeople] nvarchar(50) NULL ,
[ModifyTime] datetime NULL 
)

--添加表說明
EXECUTE sp_addextendedproperty   N'MS_Description',N'安裝時段表',N'user',N'dbo',N'table',N'System_Code_InstallationPeriod',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'System_Code_InstallationPeriod',N'column',N'Name'


--添加字段說明
EXECUTE   sp_addextendedproperty   N'MS_Description',N'【創建人】',N'user',N'dbo',N'table',N'System_Code_InstallationPeriod',N'column',N'CreatePeople'
EXECUTE   sp_addextendedproperty   N'MS_Description',N'【創建時間】',N'user',N'dbo',N'table',N'System_Code_InstallationPeriod',N'column',N'CreateTime'
EXECUTE   sp_addextendedproperty   N'MS_Description',N'【修改人】',N'user',N'dbo',N'table',N'System_Code_InstallationPeriod',N'column',N'ModifyPeople'
EXECUTE   sp_addextendedproperty   N'MS_Description',N'【修改時間】',N'user',N'dbo',N'table',N'System_Code_InstallationPeriod',N'column',N'ModifyTime'

--刪除字段說明
--EXEC sp_dropextendedproperty N'MS_Description', 'user','dbo', 'table', '表名', 'column','字段名'

創建表
創建表
alter table Personnel_Position ADD ProjectId INT NULL;
alter table Personnel_Position ADD ProjectName nvarchar(50) NULL;

--添加字段說明
EXECUTE   sp_addextendedproperty   N'MS_Description',N'【項目名稱】',N'user',N'dbo',N'table',N'Personnel_Position',N'column',N'ProjectId';
EXECUTE   sp_addextendedproperty   N'MS_Description',N'【項目名稱】',N'user',N'dbo',N'table',N'Personnel_Position',N'column',N'ProjectName';

aaa_select_table 'Personnel_Position';
追加字段
ALTER TABLE [表名] DROP COLUMN [字段名]
刪除字段

sql 增刪改查分頁 語句

--insert_System_Userinfo_Staff
--增加賬戶(職員)表_zj


BEGIN TRY 
IF((SELECT COUNT(*) FROM [dbo].[System_Userinfo_Staff] WHERE Name = '{Name}')=0)
 BEGIN
  insert [System_Userinfo_Staff] values('{Name}','{CreatePeople}',GETDATE(),'','')
  IF((SELECT @@ROWCOUNT)=1)
     SELECT ResponseNum=1,Message='保存成功'
  ELSE 
     SELECT ResponseNum=0,Message='保存失敗'
 END
ELSE
 BEGIN
  SELECT ResponseNum=0,Message='名稱重復'
 END
END TRY
BEGIN CATCH 
  SELECT ResponseNum=0,Message=ERROR_MESSAGE()
END CATCH
增加
--刪除賬戶(職員)表_zj
--delete_System_Userinfo_Staff

BEGIN TRY 
 delete [System_Userinfo_Staff] where Id = {Id}
 IF((SELECT @@ROWCOUNT)=1)
    SELECT ResponseNum=1,Message='刪除成功'
 ELSE 
    SELECT ResponseNum=0,Message='刪除失敗'
END TRY
BEGIN CATCH 
  SELECT ResponseNum=0,Message=ERROR_MESSAGE()
END CATCH
刪除
--修改賬戶(職員)表_zj
--update_System_Userinfo_Staff


BEGIN TRY 
IF((SELECT COUNT(*) FROM[dbo].[System_Userinfo_Staff] WHERE UserName = '{UserName}' AND Id != {Id})=0)
 BEGIN
   update [System_Userinfo_Staff] set UserName = '{UserName}',ModifyPeople = '{ModifyPeople}',ModifyTime = GETDATE() where Id = {Id}
   IF((SELECT @@ROWCOUNT)=1)
     SELECT ResponseNum=1,Message='修改成功'
   ELSE 
     SELECT ResponseNum=0,Message='修改失敗'
 END
ELSE
 BEGIN
   SELECT ResponseNum=0,Message='賬戶重復'
 END
END TRY
BEGIN CATCH 
  SELECT ResponseNum=0,Message=ERROR_MESSAGE()
END CATCH
修改
--page_System_Userinfo_Staff
--查詢賬戶(職員)表(分頁)

if (exists (select * from sys.objects where name = 'page_System_Userinfo_Staff')) drop proc page_System_Userinfo_Staff   --判斷存儲過程是否存在,存在則刪除然后重建。
go


create proc page_System_Userinfo_Staff  --創建存儲過程 
 @pagesize INT,
 @pageindex INT,
 @Name nvarchar (50),
 @RoleId nvarchar (50),
 @IsEnable nvarchar (50)
AS
BEGIN
    --開始
DECLARE @pagebefore INT ;
DECLARE @pagerear INT ;
DECLARE @condition nvarchar (2000) ;
SET @pagebefore =@pagesize *@pageindex ;
SET @pagerear =@pagebefore +@pagesize ;
SET @condition = ' where 1=1 ' ;
IF (@Name <> '')
SET @condition =@condition + ' and UserName like ''%' +@Name + '%''  OR [StaffName] LIKE ''%' +@Name + '%''' ;
IF (@RoleId <> '')
SET @condition =@condition + ' and RoleId = ' +@RoleId + '';
IF (@IsEnable <> '')
SET @condition =@condition + ' and IsEnable = ' +@IsEnable + '';
EXEC (
    '
    declare @table table(
    iid int identity,
  Id INT,
  UserName nvarchar(50),
  UserPassword nvarchar(50),
  StaffId INT,
  StaffName nvarchar(50),
  RoleId INT,
  RoleName nvarchar(50),
  CityId INT,
  CityName nvarchar(50),
  IsEnable  INT,
  CreatePeople nvarchar(50),
  CreateTime datetime,
  ModifyPeople nvarchar(50),
  ModifyTime datetime
    )
    insert @table
    select * from System_Userinfo_Staff ' +@condition + ' and RoleId <> 1 order by Id desc
    select * from @table where iid>' +@pagebefore + ' and iid<=' +@pagerear + '
    select count(*) as rows from @table;'
) ;
END ; --結束
分頁
--查詢賬戶(職員)表_zj
--select_System_Userinfo_Staff

select * from System_Userinfo_Staff
查詢

觸發器

--查看當前庫中所有的觸發器和與之相對應的表:
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';
查看當前庫中所有的觸發器和與之相對應的表
--Inserted表有數據,Deleted表無數據 

CREATE trigger INSERT_PrintSql
ON PrintSql 
FOR INSERT
As
INSERT into PrintSql_Log SELECT inserted.p_name, inserted.p_sql,inserted.p_remark,'增加',(SELECT client_net_address FROM sys.dm_exec_connections WHERE Session_id =@@spid),GETDATE() from inserted
插入操作(Insert)
--Inserted表無數據,Deleted表有數據 


CREATE trigger DELETE_PrintSql
ON PrintSql 
FOR DELETE
As
INSERT into PrintSql_Log SELECT Deleted.p_name, Deleted.p_sql,Deleted.p_remark,'刪除',(SELECT client_net_address FROM sys.dm_exec_connections WHERE Session_id =@@spid),GETDATE() from Deleted
刪除操作(Delete)
--Inserted表有數據(新數據),Deleted表有數據(舊數據)

CREATE trigger UPDATE_PrintSql
ON PrintSql 
FOR UPDATE
As
INSERT into PrintSql_Log SELECT inserted.p_name, inserted.p_sql,inserted.p_remark,'修改',(SELECT client_net_address FROM sys.dm_exec_connections WHERE Session_id =@@spid),GETDATE() from inserted
更新操作(Update)

查詢表詳情

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,
標識=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,
類型=b.name,
占用字節數=a.length,
長度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
小數位數=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
允許空=case   when   a.isnullable=1   then   ''else   ''   end,
默認值=isnull(e.text,''),
字段說明=isnull(g.[value],'')
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
--where   d.name='Exam_Options'         --如果只查詢指定表,加上此條件
order   by   a.id,a.colorder
查詢表詳情

循環插入

--聲明變量
DECLARE @i int   
DECLARE @iCount int   
--設置變量
SET @i = 1
SET @iCount = (SELECT COUNT(*) FROM [dbo].[Personnel_Staff] WHERE  DepartmentId = 2)
--循環
WHILE @i<= @iCount
BEGIN
--查詢符合的職員信息加入臨時表
  SELECT row_number () OVER (ORDER BY Id) AS NumberId,* INTO #Temp FROM [dbo].[Personnel_Staff] WHERE  DepartmentId = 3 ORDER BY Id ASC 
--聲明變量
  DECLARE @StaffId INT
  DECLARE @StaffName nvarchar (50)
--設置變量
  SET @StaffId = (SELECT Id FROM #Temp WHERE NumberId = @i)
  SET @StaffName = (SELECT Name FROM #Temp WHERE NumberId = @i)
--刪除臨時表
  DROP TABLE #Temp
--數據操作
  INSERT [System_Message] VALUES('1','1111',@StaffId,@StaffName,'PC端','1','【消息標題】','【消息內容】',0,'測試',GETDATE(),NULL,NULL)
--循環變量增加1
  SET @i = @i + 1 
END
循環插入

事務

BEGIN try
BEGIN TRANSACTION 
  --修改訂單狀態
  UPDATE [Order_OrderInfo] SET OrderStatusId = '13',    /*【訂單狀態Id】*/ OrderStatusName = '異常-轉異常',    /*【訂單狀態名稱】*/WHERE Id = {Id}
  --插入訂單操作記錄
  INSERT into Order_Operating_Record SELECT *,'13','異常-轉異常','{Login_UserId}','{Login_UserName}',GETDATE(),{Id},'{OperationRemarks}' from Order_OrderInfo WHERE Id = {Id}
  SELECT ResponseNum = 1,Message = '保存成功' 
  COMMIT TRANSACTION  --事務已經成功執行,提交事務。
END try
BEGIN catch 
  SELECT ResponseNum = 0,Message = ERROR_MESSAGE() 
  ROLLBACK TRANSACTION --數據處理過程中出錯,回滾到沒有處理之前的數據狀態
END catch


/******************************************************************************************/
/******************************************************************************************/
/******************************************************************************************/

--開啟事務
begin tran
--錯誤撲捉機制,看好啦,這里也有的。並且可以嵌套。
begin try  
   --語句正確
     UPDATE [erpnew].[dbo].[System_MenuJurisdiction] SET [MenuId]='11' WHERE ([Id]='1')
   --MenuId為int類型,出錯
     UPDATE [erpnew].[dbo].[System_MenuJurisdiction] SET [MenuId]='1w' WHERE ([Id]='1')
   --語句正確
     UPDATE [erpnew].[dbo].[System_MenuJurisdiction] SET [MenuId]='13' WHERE ([Id]='1')
end try
begin catch
   SELECT ResponseNum=0,Message=ERROR_MESSAGE()
   if(@@trancount>0) --全局變量@@trancount,事務開啟此值+1,他用來判斷是有開啟事務
      rollback tran  ---數據處理過程中出錯,回滾到沒有處理之前的數據狀態
end catch
if(@@trancount>0)
commit tran  --事務已經成功執行,數據已經處理妥當。
SELECT ResponseNum=1,Message='保存成功'
事務

保存從存儲過程返回的結果集

create table #helpuser
(
UserName nvarchar(128),
RoleName nvarchar(128),
LoginName nvarchar(128),
DefDBName nvarchar(128),
DefSchemaName nvarchar(128),
UserID smallint,
SID smallint
)

insert into #helpuser exec sp_helpuser

select * from #helpuser
--刪除臨時表
drop Table #helpuser
保存從存儲過程返回的結果集

其他

SELECT IDENTITY(INT,1,1) AS Id,items AS 'NavigationId' INTO #temp1 FROM Intercept ('1,2,3,4,',',')

SELECT IDENTITY(INT,1,1) AS Id,items AS 'JurisdictionId' INTO #temp2 FROM Intercept ('1,2,3,4,&1,2,7,&1,3,&1,7,','&')

SELECT a.NavigationId,b.JurisdictionId INTO #Temp3 FROM #temp1 AS a LEFT JOIN #temp2 AS b ON a.Id = b.Id;


WITH testtb2 AS 
(
SELECT A.NavigationId,A.JurisdictionId,CHARINDEX(',', A.JurisdictionId) AS STA, CHARINDEX(',', A.JurisdictionId)-1 AS LENS
FROM #Temp3 AS A 
UNION ALL
SELECT NavigationId,JurisdictionId, CHARINDEX(',', JurisdictionId, STA + 1) AS STA, CHARINDEX(',',JurisdictionId,STA+1)-STA-1 AS LENS
FROM testtb2 AS testtb2_2
WHERE (STA <> 0)
)
SELECT TOP (100) PERCENT SUBSTRING(JurisdictionId, STA - LENS, LENS) AS OrderRequest,NavigationId
FROM testtb2 AS testtb2_1
WHERE (STA <> 0)
ORDER BY JurisdictionId


DROP TABLE #Temp1
DROP TABLE #Temp2
DROP TABLE #Temp3
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 @@IDENTITY --得到的是跨域最新id

SELECT IDENT_CURRENT('table_name')--得到的是指定表的最新id

SELECT SCOPE_IDENTITY() --得到的是當前數據庫中的最后插入表的id




例子:

數據說明:

database1_table:table3

database2_table:table1/table2

以此在所屬數據庫下執行以下語句:

insert table1(cname) values('ceshi');--假設結果 1
insert table2(lcid) values('qwe');--假設結果 3

insert table3(departmentmark) values('測試');--假設結果 10

然后回到database2下:

select  @@IDENTITY,跨域,所以得到10
select ident_current('table1'),不跨域,返回指定表的最后的id,插入得到結果1
select SCOPE_IDENTITY() 不跨域,但是未指定表,所以得到結果本數據庫的最后插入的id,3
獲取SQL增加的id
INSERT INTO 表名稱 VALUES (值1, 值2,....)

INSERT INTO 表名稱 (列1, 列2,...) VALUES (值1, 值2,....)

INSERT INTO 表名稱 (列1, 列2,...) SELECT 值1, 值2,.... FROM  表名稱
增加數據
--創建序號插入臨時表
select row_number () OVER (ORDER BY Id) AS NumberId,* INTO #Temp FROM [dbo].[Personnel_Staff]  ORDER BY Id ASC 
--查詢第二條數據
select * from #Temp where NumberId =2
--刪除臨時表
drop Table #Temp
查詢第幾條
SELECT ltrim(floor(rand()*10000))
隨機數
SELECT row_number () OVER (ORDER BY Id) AS '序號' ,* FROM [dbo].[System_Code_OrderSource]
序號
--2018-11-13
SELECT CONVERT(varchar(50) , GETDATE(), 23 ) AS 'TIME'

--2018-11-13 18:46:14
SELECT CONVERT(varchar(50) , GETDATE(), 20 ) AS 'TIME'

--2019-01-14 17:15:59.920
select convert(varchar(50),GETDATE(),121)
時間轉字符串
SELECT
    CONVERT (VARCHAR(4),YEAR(GETDATE())) AS '',
    CONVERT (VARCHAR(4),MONTH(GETDATE())) AS '',
    CONVERT (VARCHAR(4),DAY(GETDATE())) AS ''
年月日
SELECT insert_id =@@IDENTITY
查詢插入的id
select * from System_Code_OrderSource a where a.id=(select max(id) from System_Code_OrderSource)
查詢表最新的一條數據
SELECT 
CASE Sex 
WHEN 0 THEN ''
WHEN 1 THEN ''
ELSE ''
END AS '性別'
FROM
    System_Userinfo_Staff


SELECT
CASE
WHEN w_grade >= 90 THEN'A'
WHEN w_grade >= 80 AND w_grade <= 89 THEN 'B'
WHEN w_grade >= 70 AND w_grade <= 79 THEN 'C'
WHEN w_grade >= 60 AND w_grade <= 69 THEN 'D'
ELSE 'E'
END AS '成績評定'
FROM
    tb_gradego
條件判斷
select * from xi a where (a.username) in  (select username from xi group by username  having count(*) > 1)
查詢重復數據
SELECT
    *,
(select TOP 1 aa.Id from System_Code_OrderSource aa where aa.Id<a.Id ORDER BY aa.Id DESC) AS 上一篇id,
(select TOP 1 aa.Id from System_Code_OrderSource aa where aa.Id>a.Id ORDER BY aa.Id) AS 下一篇id
FROM
    [dbo].[System_Code_OrderSource] AS a
WHERE
    Id = 5
跳轉上一頁下一頁
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
SELECT
    host_id() AS '主機端口號',
    host_name() AS '主機名',
  @@SERVERNAME AS '服務器的名稱',
    client_net_address '客戶端IP',
    local_net_address '服務器的IP'
FROM
    sys.dm_exec_connections
WHERE
    Session_id =@@spid
主機端口號 主機名 服務器的名稱 客戶端IP 服務器的IP
--20190306094000
select convert(varchar(8),GETDATE(),112)+replace(convert(varchar(8),GETDATE(),114),':','')

--20190306094332437
select convert(varchar(8),GETDATE(),112)+replace(convert(varchar(12),GETDATE(),14),':','')

--當月天數
select day(dateadd(ms,-3,DATEADD(m, DATEDIFF(m,0,getdate())+1,0)))

---當月第一天
select dateadd(d,-day(getdate())+1,getdate())

---當月最后一天
select dateadd(d,-day(getdate()),dateadd(m,1,getdate()))

--明年上月的最后一天此時
select dateadd(d,-day(getdate()),dateadd(m,12,getdate()))

--當月第一個星期一
SELECT DATEADD(wk, DATEDIFF(wk, '', DATEADD(dd, 6 - DAY(getdate()), getdate())), '')

--今天的所有數據
select * from System_Log where DateDiff(dd,CreateTime,getdate())=0

--昨天的所有數據
select * from System_Log where DateDiff(dd,CreateTime,getdate())=1

--7天內的所有數據
select * from System_Log where DateDiff(dd,CreateTime,getdate())<=7

--30天內的所有數據
select * from System_Log where DateDiff(dd,CreateTime,getdate())<=30

--本月的所有數據:
select * from System_Log where DateDiff(mm,CreateTime,getdate())=0

--本年的所有數據
select * from System_Log where DateDiff(yy,CreateTime,getdate())=0

--查詢今天是今年的第幾天
select datepart(dayofyear,getDate())

--查詢今天是本月的第幾天
select datepart(dd, getDate())  
select day(getDate())

--查詢本周的星期一日期是多少 (注意:指定日期不能是周日,如果是周日會計算到下周一去。所以如果是周日要減一天)
SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0)

--查詢昨天日期
select convert(char,dateadd(DD,-1,getdate()),121) 

--查詢本月第一天日期
Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) as firstday

--查詢本月最后一天日期
Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) as lastday 

--本月有多少天
select datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast((cast(year(getdate()) as varchar)+'-'+cast(month(getdate()) as varchar)+'-01' ) as datetime ))))

--求兩個時間段相差幾天
select datediff(day,'2016/5/17','2016/8/20') as daysum

--在指定的日期上±N天
select convert(char,dateadd(dd,1,getdate()),111) as riqi    

--在指定的日期上±N分鍾://查詢當前時間15分鍾之前的日期
select dateadd(mi,-15,getdate())  
時間相關
SELECT CONVERT (VARCHAR(50), dateadd(dd,1,getdate()), 23)
查詢明天
--查看執行時間和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
優化查詢
set language N'Simplified Chinese'
select datename(weekday, getdate())
select datename(dw, getdate())
星期幾
SELECT STUFF((SELECT',' + CONVERT (VARCHAR, aa.Id)FROM[dbo].[System_Code_City] AS aa FOR XML PATH ('')),1,1,'') AS Id 

declare @ids varchar(1000)
set @ids='1,2,3,4'
select * from System_Code_City where charindex(','+ltrim(ProjectId)+',',','+@ids+',')>0
1,2,3
UPDATE [表名] SET [字段] = replace([字段], '替換前內容', '替換后內容');
替換
DROP TABLE 表名稱  --刪除表
TRUNCATE TABLE 表名稱  --清空表中的數據
DELETE FROM 表名稱  WHERE 列名稱 =--刪除表中的數據
刪除/清空表數據
復制表結構及數據到新表

select * into 目標表名 from 源表名(要求目標表不存在,因為在插入時會自動創建)

只復制表結構到新表

select * into 目標表名 from 源表名 WHERE 1=2 即:讓WHERE條件不成立.
復制表
--查看被鎖表:
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)
查看被鎖表/解鎖
--Union可以對兩個或多個結果集進行連接,形成“並集”。子結果集所有的記錄組合在一起形成新的結果集。

SELECT Name FROM Person_1
UNION
SELECT Name FROM Person_2


--Except可以對兩個或多個結果集進行連接,形成“差集”。返回左邊結果集合中已經有的記錄,而右邊結果集中沒有的記錄。

SELECT Name FROM Person_1
EXCEPT
SELECT Name FROM Person_2


--InterSect可以對兩個或多個結果集進行連接,形成“交集”。返回左邊結果集和右邊結果集中都有的記錄。

SELECT Name FROM Person_1
INTERSECT
SELECT Name FROM Person_2
SQL 交/並/差

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
    
sql 發送郵件

 

 

“因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權”,終解決方案如下

關鍵SQL語句:
ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE

用完之后再
ALTER database [ datebase] set online

 


免責聲明!

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



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