Monday, February 5, 2018

SQL Server DBA general queries - A

TOPIC: SQL Server - Move file from one location to different location

-- Detail : Move file to different drive
[FileMovement]
(
@DirPath Varchar(1000),
@Dest_Path  Varchar(1000) 
)
As
Begin
Declare @Qry Varchar(1000)
Set @Qry  = 'Move '+@DirPath+' '+@Dest_Path
--Print @Qry
Exec Xp_cmdshell @Qry, no_output
End
GO

TOPIC: SQL Server - Folder and File details
-- Detail : List of files with directory name and creation date
[FileList_SP_Size]
(
@DirPath NVarchar(255)
)
As

Declare @SQL Nvarchar(255)

Create table #tmp
(
Txt nvarchar(500),
Dir nvarchar(500),
[FileSize] nvarchar(100)
)


Set @SQL  = 'Dir/aa/s/p '+CONVERT(NVarchar(255),@DirPath)+'*.*'

Insert Into #tmp(Txt)
Exec Xp_cmdshell @SQL   --'Dir/aa/s/p '+CONVERT(NVarchar(255),@DirPath)+'*.*'

Print(@SQL)
Alter Table #tmp Add [Date1] nvarchar(50)


Delete from #tmp 
Where txt is null
--OR txt Like ' Directory%'
OR txt Like '%file%bytes%'
OR txt Like '%Volume%ser%'
OR txt Like 'Volume%in%'
OR txt = '%bytes%free%'
OR Ltrim(txt) = ''



Update #tmp  
Set txt = Ltrim(Rtrim(SUBSTRING(txt,40,200))),
[FileSize]= Replace(Ltrim(Rtrim(SUBSTRING(txt,25,15))),',',''),
[Date1] = Left(txt,20)
Where txt not Like ' Directory%'
Delete from #tmp 
Where txt is null
OR txt = '%bytes%free%'
OR Ltrim(txt) = ''



Alter Table #tmp Add Rowid int IDENTITY(1,1)

Update #Tmp Set Dir = Txt
Where txt Like ' Directory%'




Declare @Rowid int ,@Txt Nvarchar(255),@Dir Nvarchar(255)
Declare File_CURSOR Cursor for
     Select  Rowid,Txt,Dir from #tmp Where txt Like ' Directory%' Order By Rowid Desc
open File_CURSOR
Fetch next from File_CURSOR INTO @Rowid ,@Txt ,@Dir 
while @@Fetch_Status=0 
BEGIN
Update #Tmp Set Dir = @Dir
Where Rowid >= @Rowid 
And Dir is null


Fetch next from File_CURSOR INTO @Rowid ,@Txt ,@Dir 
END 
CLOSE File_CURSOR
DEALLOCATE File_CURSOR

Update #Tmp Set Dir = Replace(Dir,' Directory of','')

Select Rowid, Txt As [File name],Dir As [Directory Name] , [FileSize],[Date1]  from #Tmp
Where Txt Not Like 'bytes%free%'
And Date1 is not null
 
GO


TOPIC: SQL Server - Backup Latest Backup Details

-- Detail : SP to find the latest backup 
/* Parameter @Avoid_CopyOnly
-- 1 == Will not display copy only backups
-- 0 ==  Will display all type of backups */

[Find_Latest_Backup]
(
@DB_Name Varchar(100),
@Avoid_CopyOnly Bit = 1
)
As
BEGIN
SET NOCOUNT ON
Select Top 100
backupset.database_name  ,
backupmediafamily.physical_device_name  ,
Case When  [type]  = 'D' AND is_copy_only = 1 Then 'FULL (COPY ONLY)'
When [type]  =  'D' AND is_copy_only = 0 Then 'FULL'
When [type]  = 'I' AND is_copy_only = 1 Then 'Differential (COPY ONLY)'
When [type]  = 'I' AND is_copy_only = 0 Then 'Differential'
When [type]  = 'L' Then 'Log'
When [type]  = 'F' Then 'File or filegroup'
When [type]  = 'G' Then 'Differential file'
When [type]  = 'P' Then 'Partial'
When [type]  = 'Q' Then 'Differential partial'
Else '' End as Backup_Type
,backupset.name As Backup_Name,backupset.user_name  
,CONVERT(date, msdb.dbo.backupset.backup_finish_date, 101) as finish_date  
, Convert(Decimal(10,2),msdb.dbo.backupset.backup_size/1000/1000) as backupsizeMB  
,Convert(Decimal(10,2),backupset.compressed_backup_size /1000/1000) as compressed_backup_size_MB  
Into #Bkp1
FROM   
msdb.dbo.backupmediafamily   
INNER JOIN msdb.dbo.backupset   
ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  
Where backupset.database_name = @DB_Name
And is_copy_only = 0
Order By backupset.backup_finish_date Desc

Select Top 100
backupset.database_name  ,
backupmediafamily.physical_device_name  ,
Case When  [type]  = 'D' AND is_copy_only = 1 Then 'FULL (COPY ONLY)'
When [type]  =  'D' AND is_copy_only = 0 Then 'FULL'
When [type]  = 'I' AND is_copy_only = 1 Then 'Differential (COPY ONLY)'
When [type]  = 'I' AND is_copy_only = 0 Then 'Differential'
When [type]  = 'L' Then 'Log'
When [type]  = 'F' Then 'File or filegroup'
When [type]  = 'G' Then 'Differential file'
When [type]  = 'P' Then 'Partial'
When [type]  = 'Q' Then 'Differential partial'
Else '' End as Backup_Type
,backupset.name As Backup_Name,backupset.user_name  
,CONVERT(date, msdb.dbo.backupset.backup_finish_date, 101) as finish_date  
, Convert(Decimal(10,2),msdb.dbo.backupset.backup_size/1000/1000) as backupsizeMB  
,Convert(Decimal(10,2),backupset.compressed_backup_size /1000/1000) as compressed_backup_size_MB  
Into #Bkp2
FROM   
msdb.dbo.backupmediafamily   
INNER JOIN msdb.dbo.backupset   
ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id  
Where backupset.database_name = @DB_Name
And is_copy_only = 1
Order By backupset.backup_finish_date Desc

If(@Avoid_CopyOnly =0)
Begin
Select * from #Bkp1
Union All
Select * from #Bkp2
Order By finish_date desc
End

If(@Avoid_CopyOnly =1)
Begin
Select * from #Bkp1 Order By finish_date desc
End


END
GO


TOPIC: SQL Server - Generic Email Notification 

-- Detail : Generic email
--[Generic_Notification_Mail] @profile_name_P = 'SQL_Mail_Alert', @Subj = 'Test generic email',@Body1 = 'This is a test email. Please ignore.',@Email = 'abc@xyz.com',@CC=''

[Generic_Notification_Mail]
(
@profile_name_P Varchar(255),
@Subj Varchar(500),
@Body1 Varchar(4000),
@Email Varchar(255),
@CC Varchar(255)
)
As
BEGIN
Declare @Today Date
Select @Today = CONVERT(Date,Getdate())

Declare @Body_Main Varchar(8000)
Select @Body_Main = ''
Select @Body_Main = @Body_Main + '<td><font face="Calibri"><font color="#2471A3"><font style="font-size: 11pt;">Hi All,</font></font></font></td><br></tr>'
Select @Body_Main = @Body_Main + '<td><font face="Calibri"><font color="#2471A3"><font style="font-size: 11pt;">'+@Body1+' </font></font></font></td><br>'

Select @Body_Main = @Body_Main+'<br><br><td><font color="#2471A3"><font face="Calibri"><font style="font-size: 11pt;">Thanks & Regards,</font></font></font></td><br><br></tr>'
Select @Body_Main = @Body_Main+'<td><b><font color="#2471A3"><font face="Calibri"><font style="font-size: 11pt;">Team Name</font></font></font></b></td><br></tr>'
Select @Body_Main = @Body_Main+'<br><br><br><br>'
Select @Body_Main = @Body_Main+'<td><b><font color="Blue"><font face="Calibri"><font style="font-size: 11pt;">Note : System generated mail, For any concern revert back to XXX team (abc@xyz.COM).</font></font></font></b></td></tr>'


Print 'Notification code'

EXEC msdb.dbo.sp_send_dbmail                  
@profile_name = @profile_name_P, --'SQL_Mail_Alert',
--@recipients= @Recipient_List,
@recipients= @Email,
@copy_recipients =@CC,
@subject = @Subj,
@body = @Body_Main,                                
@body_format = 'HTML'    

End

GO


TOPIC: SQL Server - Index Rebuild / Re-Organize for all user DBs

-- Index rebuild for all user db  
[IndexRebuild_All_DB]
As
SET NOCOUNT ON
DECLARE @Database VARCHAR(255)   
DECLARE @Table VARCHAR(255),@Table_Short  VARCHAR(255) 
DECLARE @cmd NVARCHAR(4000)  
DECLARE @fillfactor INT ,@bit Bit
--DECLARE @Avg_Frag Float

SET @fillfactor = 90 

DECLARE DatabaseCursor CURSOR FOR  
SELECT [name] FROM sys.databases 
Where user_access = 0  And [state] = 0
And database_id >= 5
And [Name] Not In('ReportServer$SQL','ReportServer$SQLTempDB','distribution')
--And [Name] in('SONORA','CNA')
ORDER BY 1  

--=============================
-- Temp table for logging
--=============================
IF OBJECT_ID('tempdb.dbo.#ObjDetails') IS NOT NULL
DROP TABLE #ObjDetails
CREATE TABLE #ObjDetails (
Rowid Int Identity(1,1),
DBName Varchar(200),
Table_Name Varchar(200),
Avg_Frag Float,
[Action] Varchar(30),
Dt_Stamp Datetime Default(Getdate())
)



OPEN DatabaseCursor  
FETCH NEXT FROM DatabaseCursor INTO @Database  
WHILE @@FETCH_STATUS = 0  
BEGIN  

Print 'DB Name ==>'+DB_Name(DB_ID(@Database))

SET @cmd = 'Insert Into DBA_Admin..Table_Fragment_Before(database_id,object_id,avg_fragmentation_in_percent) '+CHAR(10)
SET @cmd = @cmd + ' Select database_id,NULL,NULL FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(' +Quotename(@Database,'''') + ' ),NULL,NULL,NULL,NULL) F Where Object_Name(object_id)= ' +Quotename(@Table_Short,'''')+CHAR(10)
   --Print(@cmd) 
           Exec (@cmd) 
           SET @cmd = ' Insert Into #ObjDetails(DBName,Table_Name,Avg_Frag,[Action])' +CHAR(10)
   SET @cmd = @cmd + ' Values( ''' +@Database + ''', '+Quotename('Start Processing','''')+',0,'''+'DB'+''')'+Char(10)
  --Print(@cmd) 
   Exec (@cmd) 

           
   SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT ''['' + table_catalog + ''].['' + table_schema + ''].['' + 
  table_name + '']'' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES 
  WHERE table_type = ''BASE TABLE'' '
--  And table_name = ''SONORAREPOSITORY''  '   

   -- create table cursor  
   EXEC (@cmd)  
   OPEN TableCursor   

   FETCH NEXT FROM TableCursor INTO @Table   
   WHILE @@FETCH_STATUS = 0   
   BEGIN   
Select @Table_Short = Reverse(Substring(Reverse(@Table),2,CHARINDEX('[',Reverse(@Table),0 )-2))

--Print ('Table Name ==>  '+@Table_Short)

SET @cmd = 'Insert Into DBA_Admin..Table_Fragment_Before(database_id,object_id,avg_fragmentation_in_percent) '+CHAR(10)
SET @cmd = @cmd + ' Select database_id,object_id,avg_fragmentation_in_percent FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(' +Quotename(@Database,'''') + ' ),NULL,NULL,NULL,NULL) F Where Object_Name(object_id)= ' +Quotename(@Table_Short,'''')+CHAR(10)
   --Print(@cmd) 
           Exec (@cmd) 


           -- SQL 2005 or higher command 
           SET @cmd = 'Declare @a bit,@Avg_Frag  Float = 0'+CHAR(10)
           SET @cmd = @cmd + 'Select @Avg_Frag = ISNULL(avg_fragmentation_in_percent,0) FROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(' +Quotename(@Database,'''') + ' ),NULL,NULL,NULL,NULL) F Where Object_Name(object_id)= ' +Quotename(@Table_Short,'''')+'  And avg_fragmentation_in_percent > 0'+CHAR(10)
           SET @cmd = @cmd + ' If (@Avg_Frag > 30)'+CHAR(10)
           SET @cmd = @cmd + ' Begin '+CHAR(10)  
           SET @cmd = @cmd + ' Print '+'''RB'''+CHAR(10)                               
           SET @cmd = @cmd +' ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')' +CHAR(10)
           SET @cmd = @cmd + ' Insert Into #ObjDetails(DBName,Table_Name,Avg_Frag,[Action])' +CHAR(10)
   SET @cmd = @cmd + ' SELECT ''' +@Database + ''', Table_Name,@Avg_Frag,'''+'RB'+''' From  INFORMATION_SCHEMA.TABLES Where TABLE_NAME = ' +Quotename(@Table_Short,'''')+CHAR(10)
           SET @cmd = @cmd + ' End '+CHAR(10)
           SET @cmd = @cmd + ' Else If (@Avg_Frag Between 1 And 30)'+CHAR(10)
           SET @cmd = @cmd + ' Begin '+CHAR(10)           
           SET @cmd = @cmd + ' Print '+'''RO'''+CHAR(10)                                          
           SET @cmd = @cmd +' ALTER INDEX ALL ON ' + @Table + ' REORGANIZE ' +CHAR(10)
           SET @cmd = @cmd + ' Insert Into #ObjDetails(DBName,Table_Name,Avg_Frag,[Action])' +CHAR(10)
   SET @cmd = @cmd + ' SELECT ''' +@Database + ''', Table_Name,@Avg_Frag,'''+'RO'+''' From  INFORMATION_SCHEMA.TABLES Where TABLE_NAME = ' +Quotename(@Table_Short,'''')+Char(10)
           SET @cmd = @cmd + ' End '+CHAR(10)           
           SET @cmd = @cmd + ' Else '+CHAR(10)
           SET @cmd = @cmd + ' Begin '+CHAR(10)           
           SET @cmd = @cmd + ' Set @a = 100'+CHAR(10)           
          -- SET @cmd = @cmd + ' Print '+'''N/A'''+CHAR(10)                                          
           SET @cmd = @cmd + ' End '+CHAR(10)           

  -- Print(@cmd) 
           Exec (@cmd) 


       FETCH NEXT FROM TableCursor INTO @Table   
   END   

   CLOSE TableCursor   
   DEALLOCATE TableCursor  

Exec sp_MSForEachtable 'update statistics ? with fullscan'
   FETCH NEXT FROM DatabaseCursor INTO @Database  
END  
CLOSE DatabaseCursor   
DEALLOCATE DatabaseCursor


Select * from #ObjDetails 
Drop table #ObjDetails

/*
Create Table Table_Fragment_Before
(
database_id Int,
object_id Bigint,
avg_fragmentation_in_percent Float,
DateTimeStamp Datetime Default(Getdate())
)

Create Table Table_Fragment_After
(
database_id Int,
object_id Bigint,
avg_fragmentation_in_percent Float,
DateTimeStamp Datetime Default(Getdate())
)

*/
GO


 
TOPIC: SQL Server - Empty Folder containts

[Empty_Folder]
( @DirPath Varchar(1000)
)As
BEGIN
DECLARE  @CMD    Varchar(1000)
         
select   @CMD      = 'CD ' + @DirPath 

create table #output (output varchar(255) null)
insert #output exec  master..xp_cmdshell @CMD

--select [output] As OtptTest from #output --where output is not null

IF NOT EXISTS(select * from #output where output is not null)
BEGIN
Print 'Validation pass - Folder exists'
--Correct the directory path
IF RIGHT(@DirPath,1)= '\'
Select @DirPath = SUBSTRING(@DirPath,1,LEN(@DirPath)-1) 

Set @CMD  = 'DEL /F /Q /S '+@DirPath+'\*.*'
Print 'Cleanup folder - ' +@DirPath 
Exec XP_CmdShell @CMD

END
DROP TABLE #output
END

GO


TOPIC: SQL Server - Check Folder Existence

/*
DECLARE @Status_Flag bit
EXEC [dbo].[CheckFolderExistance]
@Folder_Path = N'D:\DB_Backup',
@Status_Flag = @Status_Flag OUTPUT
*/
[CheckFolderExistance]
( @Folder_Path Varchar(255),
@Status_Flag Bit Output
)As
Begin
Declare @CMD Varchar(1000)
Set @Status_Flag = 0
Select   @CMD      = 'CD ' + @Folder_Path 
create table #output_15 (output varchar(255) null)
insert #output_15 exec  master..xp_cmdshell @CMD
-- Check the folder exists (If no value then folder exists; if error value then folder does't exists)
IF NOT EXISTS(select * from #output_15 where output is not null)
Set @Status_Flag  = 1

End
GO


TOPIC: SQL Server - Database Growth

[DatabaseGrowth] @pDBName sysname = NULL
 AS
BEGIN
SET NOCOUNT ON;
 DECLARE @DatabaseName SYSNAME
 
-- Use current database, if a database name is not specified in input parameter
SET @DatabaseName = ISNULL(@pDBName, DB_NAME())
 SELECT  backup_start_date AS StartTime
        ,@DatabaseName AS DatabaseName
         ,filegroup_name AS FilegroupName
         ,logical_name AS LogicalFilename
         ,physical_name AS PhysicalFilename
         ,CONVERT(NUMERIC(9,2), file_size/1048576) AS FileSizeInMB
         ,Growth AS PercentageGrowth
 FROM (
     SELECT b.backup_start_date
            ,a.backup_set_id
            ,a.file_size
            ,a.logical_name
            ,a.[filegroup_name]
            ,a.physical_name
            ,(SELECT CONVERT(numeric(5,2),((a.file_size * 100.00)/i1.file_size)-100)
             FROM msdb.dbo.backupfile i1
             WHERE i1.backup_set_id = 
              (
              SELECT MAX(i2.backup_set_id) 
              FROM msdb.dbo.backupfile i2 JOIN msdb.dbo.backupset i3
              ON i2.backup_set_id = i3.backup_set_id
              WHERE i2.backup_set_id < a.backup_set_id 
              AND i2.file_type='D' 
              AND i3.database_name = @DatabaseName 
              AND i2.logical_name = a.logical_name 
              AND i2.logical_name = i1.logical_name 
              AND i3.type = 'D'
              )
               AND i1.file_type = 'D' 
 ) AS Growth
 FROM msdb.dbo.backupfile a
 JOIN msdb.dbo.backupset b
 ON a.backup_set_id = b.backup_set_id
 WHERE b.database_name = @DatabaseName
 AND a.file_type = 'D' 
 AND b.type = 'D'
 ) AS Derived
 WHERE   ISNULL(Growth, 0.0) <> 0.0
 ORDER BY logical_name, StartTime
 END


GO


TOPIC: SQL Server -All User List

-- Detail : List of users from all databases / specific user   
-- Exec USP_UserList_All_DB 'ALL'    
-- Exec USP_UserList_All_DB 'xyz'    
[USP_UserList_All_DB]    
(     @UserName Varchar(100)    
)    As    
BEGIN    
If not exists(Select 1 from sysobjects where Xtype = 'U' and Name = 'User_Details')    
Begin    
CREATE TABLE [dbo].[User_Details](    
 [DBName] [nvarchar](128) NULL,    
 [DATABASE_ROLE] [sysname] NOT NULL,    
 [DATABASE_USER] [sysname] NOT NULL,    
 [TYPE_DESC] [nvarchar](60) NULL,    
 [CREATE_DATE] [datetime] NOT NULL,    
 [Timestamp] datetime Default(Getdate())     
) ON [PRIMARY]    
End    
Truncate table User_Details    
    
DECLARE @command varchar(8000)     
SELECT @command = 'USE [?] INSERT INTO [DBA_ADMIN].[dbo].[User_Details]    
           ([DBName]    
           ,[DATABASE_ROLE]    
           ,[DATABASE_USER]    
           ,[TYPE_DESC]    
           ,[CREATE_DATE])    
SELECT DB_NAME() As DBName,rp.NAME AS DATABASE_ROLE, mp.NAME AS DATABASE_USER, mp.TYPE_DESC,mp.CREATE_DATE    
from sys.database_role_members drm    
  join sys.database_principals rp on (drm.role_principal_id = rp.principal_id)    
  join sys.database_principals mp on (drm.member_principal_id = mp.principal_id)    
order by rp.name           '    
EXEC sp_MSforeachdb @command     
    
If (ISNULL(@UserName,'')=''OR @UserName = 'ALL')    
 Select * from [User_Details] Order By DATABASE_USER,Database_Role    
Else    
 Select * from [User_Details] Where DATABASE_USER = @UserName Order By DBName,DATABASE_USER,Database_Role    
END


Print 'Select * from [User_Details] Order By DATABASE_USER,Database_Role    '
GO

No comments:

Post a Comment