Tuesday, December 8, 2015

MSSQL - Write String to A File


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[USP_TEST_WriteToFile] @FileName VARCHAR(255), @Text1 VARCHAR(MAX)
AS
DECLARE @FS int, @OLEResult int, @FileID int

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @OLEResult <> 0 PRINT 'Scripting.FileSystemObject'

--Open a file
execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 2, 1
IF @OLEResult <> 0 PRINT 'OpenTextFile'

--Write Text1
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text1
IF @OLEResult <> 0 PRINT 'WriteLine'

EXECUTE @OLEResult = sp_OADestroy @FileID

EXECUTE @OLEResult = sp_OADestroy @FS

MSSQL - Some Useful SQL Scripts and Tips

-- get a folder list using xp_cmdshell
CREATE TABLE #Temp(FileName VARCHAR(255))
DECLARE @SQL VARCHAR(1000)
SET @SQL = 'dir "C:\Temp\*.xls" /b'
INSERT INTO #Temp(FileName) EXEC Master..xp_cmdShell @SQL
SELECT * FROM #Temp WHERE FileName IS NOT NULL


-- get a folder list using xp_dirtree
CREATE TABLE #Temp(FileName VARCHAR(255), Depth INT, FileFlag INT)
INSERT INTO #Temp EXEC xp_dirtree 'C:\Temp', 1, 1
SELECT * FROM #Temp



-- find a column name conatins some string
SELECT
     t.name AS table_name
    ,SCHEMA_NAME(schema_id) AS schema_name
    ,c.name AS column_name
FROM sys.tables AS t
JOIN sys.columns c
  ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%ppp%'
ORDER BY schema_name, table_name;



-- check existence of a table
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND  TABLE_NAME = 'NewTableName')
  PRINT 'Not Exists'


-- check existence of a column in a table
IF NOT EXISTS (SELECT * FROM SYS.COLUMNS where Name = N'NewColumnName' AND Object_ID = Object_ID(N'TableName'))
  PRINT 'Not Exists'
begin
    ALTER TABLE BT_CustomerConfiguration
    ADD UTF VARCHAR(10)
End


-- Create store procedure if not exist already
IF OBJECT_ID('dbo.USP_MyStoredProcedure') IS NULL
EXEC('CREATE PROCEDURE dbo.USP_MyStoredProcedure  AS DUMMY:')
ALTER PROCEDURE


-- Cursor Template
DECLARE @tablename VARCHAR(50), SQL VARCHAR(2000)

DECLARE Mycursor CURSOR FOR SELECT Table_name FROM information_schema.tables where TABLE_SCHEMA = 'lp' order by 1
OPEN Mycursor

FETCH NEXT FROM Mycursor  INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN
   SELECT @tablename
   FETCH NEXT FROM Mycursor  INTO @tablename
END

CLOSE Mycursor
DEALLOCATE Mycursor


--Creates a DB with default settings if not exist
USE master;
go
IF EXISTS (SELECT * FROM sys.databases WHERE name = 'TestDBAudit')
    DROP DATABASE TestDBAudit;
go
CREATE DATABASE TestDBAudit;
Go


-- drop temp table
IF OBJECT_ID('tempdb..#temp1') IS NOT NULL EXEC('DROP TABLE #temp1')



-- create function which returns a table
ALTER FUNCTION FUNC_LP_GetHistoricCashSummary(@CompanyNum VARCHAR(2), @LeaseNumList VARCHAR(MAX))
RETURNS TABLE
AS

RETURN
(
..
)


-- user account maintenance
SET QUOTED_IDENTIFIER OFF
GO

-- Remove user from each database where the account exists
EXEC sp_Msforeachdb "IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'MYDOMAIN\UserName')
                     DROP USER [MYDOMAIN\UserName]"
GO

-- Remove login from this SQL Server
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'MYDOMAIN\UserName') DROP LOGIN [EPGPDOM\tJanowich] 
GO 


-- Event logging from SQL script
EXEC master..xp_logevent 90000, '###0###', 'ERROR'


-- Check and Delete temp table
IF OBJECT_ID('tempdb..##TEMP_AP') IS NOT NULL EXEC('DROP TABLE ##TEMP_AP')


-- Check and Delete existing table
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '#Temp_Table') EXEC('DROP TABLE #Temp_Table')


-- List all running processes for the default database
DECLARE @DatabaseName VARCHAR(50) = DB_NAME()
SELECT * FROM MASTER.dbo.SysProcesses WHERE DBId = DB_ID(@DatabaseName)


-- List all running processes for the default database
SELECT sqltext.TEXT,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext

KILL [session_id]


-- List all blocked processes
SELECT
     spid,
     status,
     loginame=SUBSTRING(loginame,1,12),
     hostname=SUBSTRING(hostname,1, 12),
     blk = CONVERT(char(3), blocked),
     dbname=SUBSTRING(DB_NAME(dbid),1, 10),
     cmd,
     waittype
FROM master.dbo.sysprocesses
WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses)


-- Check job status
Exec msdb..sp_help_job @job_name = 'Job Name'
--Check for "current_execution_status", if its "4", the job is not running, if "1" its executing.


-- drop all statistics
SELECT 'EXEC (''DROP STATISTICS [' + su.name + '].[' + so.name + '].[' + si.name + ']'')'
FROM sysindexes si
JOIN sysobjects so
ON si.id = so.id
JOIN sysusers su
on su.uid = so.uid
WHERE INDEXPROPERTY(si.id,si.name, 'IsStatistics') = 1
--AND si.name not like '_WA_Sys%'
AND OBJECTPROPERTY(so.id, 'IsUserTable') = 1
ORDER BY so.name, si.name



-- Read and sort Columns
DECLARE @TBLName nvarchar(128)
SET @TBLName = N'MyTable'

SELECT name, object_id FROM sys.tables WHERE name = @TBLName

SELECT name, column_id, object_id
FROM sys.columns
WHERE object_id IN
     (SELECT object_id
     FROM sys.tables
     WHERE name = @TBLName)
order by name


-- using VALUES to construct a temp table
SELECT col1, col2
FROM (VALUES ('January', 1),('Feburary', 2),('March', 3),('April', 4),('May', 5)) AS tbl(col1, col2)
WHERE tbl.col1 = 'January'


-- SQL to truncate all tables
Select DISTINCT 'TRUNCATE TABLE [' + TABLE_NAME + ']'
From INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME like 'LPlus%'


-- Chaneg NVARCHAR to VARCHAR for all tables
Select 'Alter Table [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] Alter Column [' + COLUMN_NAME + '] VarChar(' + CAST(CHARACTER_MAXIMUM_LENGTH As VARCHAR) + ')'
From INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'NVARCHAR'


-- Display all running SQL jobs
SELECT sj.name
   , sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
   AND sja.stop_execution_date IS NULL


-- Checking completion of DB recovery
SELECT percent_complete, start_time, status, command, estimated_completion_time, cpu_time, total_elapsed_time
FROM sys.dm_exec_requests
order by 1 desc


-- Loopback SQL Call
if exists (select * from master..sysservers where srvname = 'loopback')
    exec sp_dropserver 'loopback'
go
exec sp_addlinkedserver @server = N'loopback',
    @srvproduct = N'',
    @provider = N'SQLOLEDB',
    @datasrc = @@servername
go

select * into #t from openquery(loopback, 'exec yourSproc')
select * from #t
drop table #t
go


-- update SQL Statistics
sp_MSForEachDB @command1 = "use ?;exec sp_updatestats"


-- Create Views that mirror another databases tables
SELECT
'create view '+tbl.name+' as select * from plus.dbo.['+tbl.name++']'+char(10)+'go'+char(10)
FROM
sys.tables AS tbl
WHERE
(CAST(
 case
    when tbl.is_ms_shipped = 1 then 1
    when (
        select
            major_id
        from
            sys.extended_properties
        where
            major_id = tbl.object_id and
            minor_id = 0 and
            class = 1 and
            name = N'microsoft_database_tools_support')
        is not null then 1
    else 0
end         
             AS bit)=0)
ORDER BY [Name] ASC



Windows - Hide A User Account from Login Screen

• HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon In the left panel, right click on Winlogon and click New and click Key. Type SpecialAccounts and press Enter In the left panel, right click on SpecialAccounts and click New and click Key. Type UserList and press Enter. In right panel of UserList, right click on a empty area and click New then click DWORD (32bit) Value. Type in the name of the user account that you want to hide and press Enter.eg: Everyday Account.

Monday, December 7, 2015

MSSQL - Populating Date Dimension

DECLARE @startdate DATE = '20000101', @enddate DATE = '20301231' ;

WITH c
AS (
    SELECT
         Num = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1
    FROM sys.columns c
    CROSS JOIN sys.columns c1
)
, d
AS (
    SELECT
         [date] = DATEADD(day, Num, @startdate)
        ,Num
    FROM c
    WHERE
         Num &gt;= 0
     AND Num &lt;= DATEDIFF(day, @startdate, @enddate)
)

SELECT datekey = CAST(CONVERT(VARCHAR(8), DATEADD(day, Num, @startdate), 112) AS INT)
    , [date]
    , [DayOfMonth] = DATEPART(day, [Date])
    , [DayName] = DATENAME(weekday, [Date])
    , [DayOfYear] = DATEPART(dayofyear, [Date])
    , [WeekOfYear] = DATEPART(week, [Date])
    , [MonthName] = DATENAME(month, [Date])
    , [MonthNumber] = DATEPART(month, [Date])
    , [QuarterNumber] = DATEPART(quarter, [Date])
    , [Year] = YEAR([date])
    , [FiscalYear] = CASE WHEN DATEPART(month, [Date]) &lt; 7 THEN YEAR([date]) ELSE YEAR([date]) + 1 END
FROM d

MSSQL - Save A String to A File

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[USP_TEST_WriteToFile] @FileName VARCHAR(255), @Text1 VARCHAR(MAX)
AS
DECLARE @FS int, @OLEResult int, @FileID int

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @OLEResult &lt;&gt; 0 PRINT 'Scripting.FileSystemObject'

--Open a file
execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT, @FileName, 2, 1
IF @OLEResult &lt;&gt; 0 PRINT 'OpenTextFile'

--Write Text1
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text1
IF @OLEResult &lt;&gt; 0 PRINT 'WriteLine'

EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS

MSSQL - Recover your SQL when SSMS crashes

Last runs SQL scripts from execution history
This script can only work without server restart

Use DataWarehouse

SELECT
     execquery.last_execution_time AS [Date Time]
    ,execsql.text AS [Script]
FROM sys.dm_exec_query_stats AS execquery
CROSS APPLY sys.dm_exec_sql_text(execquery.sql_handle) AS execsql

ORDER BY execquery.last_execution_time DESC