Answer here.
SELECT TOP n rows
I love how top can accept a variable. You could pass it into a procedure.
DECLARE @vcOut VARCHAR(MAX),
@nTop INT
SELECT @nTop = 5
SELECT TOP (@nTop)
@vcOut = COALESCE(@vcOut, '') + NAME + CHAR(10)
FROM sys.sysdatabases
PRINT @vcOut
--
SQL Processes, sys.dm_exec_connections and last sql statement
Last SPIDs, their statement, network packet size.
SELECT c.session_id,
s.host_name,
s.login_name,
[LastStatement].[[text]],
c.net_packet_size,
s.login_time,
s.status,
d.name
FROM sys.dm_exec_connections c
INNER JOIN sys.dm_exec_sessions s
ON c.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS LastStatement
LEFT OUTER JOIN
sys.databases d on d.database_id = [LastStatement].dbid
ORDER BY s.[status],
s.login_time DESC,
s.[host_name]
--
xp_cmdshell error: ‘C:\Program’ is not recognized as an internal or external command,
Apparently in my 64-bit environment I can’t execute the following command.
DECLARE @vcCmd VARCHAR(8000) SELECT @vcCmd = '"C:\Program Files\Winzip\WZZIP.exe" -es -a "E:\DATA\test.zip" "E:\DATA\test.dat"' EXEC master..xp_cmdshell @vcCmd = @vcCmd /* 'C:\Program' is not recognized as an internal or external command, operable program or batch file. */
The solution is I can execute other DOS commands, so let’s concatenate them.
DECLARE @vcCmd VARCHAR(8000) SELECT @vcCmd = 'C: && CD "C:\Program Files\Winzip\" && WZZIP.exe -es -a "E:\DATA\test.zip" "E:\DATA\test1.dat"' EXEC master..xp_cmdshell @vcCmd = @vcCmd
Check SQL jobs which have run during daylight saving’s change hours.
What has run, during the last month, on Sunday’s between 1:59 AM and 3?
Use the to check on daylight saving’s jobs which might be missed.
SELECT MAX(master_admin.dbo.fn_INTtoDateTime(run_date, run_time) ), j.name FROM msdb.dbo.sysjobhistory h WITH (NOLOCK) JOIN msdb.dbo.sysjobs j WITH (NOLOCK) ON j.job_id = h.job_id WHERE datename(dw, convert(varchar(10),run_date, 112) ) = 'Sunday' AND run_time BETWEEN 015900 AND 030000 AND step_id = 0 AND run_date >= CONVERT(VARCHAR(8), DATEADD(day, -31, GETDATE()), 112) GROUP BY j.name ,DATENAME(weekday, CONVERT(VARCHAR(10), run_date, 112)) ORDER BY name
This uses one of my functions. fn_INTtoDateTime
[master_admin].[dbo].[fn_INTtoDateTime]
I use this when querying msdb.dbo.sysjobhistory.
USE [master_admin]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[fn_INTtoDateTime] (
@vcDate VARCHAR(8),
@vcTime VARCHAR(6)
)
RETURNS DATETIME
AS
BEGIN
SET @vcDate = RIGHT(RTRIM('00000000' + CONVERT(CHAR(8), @vcDate) + ' '), 8)
SET @vcTime = RIGHT(RTRIM('00000000' + CONVERT(CHAR(6), @vcTime) + ' '), 6)
IF @vcDate = '00000000'
SET @vcDate = LEFT(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(23), CAST(0 AS SMALLDATETIME), 121),
'-', ''), ':', ''),
SPACE(1), ''), 8)
RETURN (
CAST(SUBSTRING(@vcDate,1,4) + '-' + SUBSTRING(@vcDate,5,2) + '-' + SUBSTRING(@vcDate,7,2) + ' ' +
SUBSTRING(@vcTime,1,2) + ':' + SUBSTRING(@vcTime,3,2) + ':' + SUBSTRING(@vcTime,5,2)
AS DATETIME)
)
END
GO
SQL – All databases users all their roles, except reader
For every database return non-db_datareaders, dbo, and ## users database permissions.
-- Declaration of table variable for the storage of results
DECLARE @result AS TABLE (
database_name SYSNAME,
role_name SYSNAME,
principal_name SYSNAME
);
-- Insert the resultset from each database
INSERT INTO @result
EXEC sp_msforeachdb N'USE [?]
SELECT CASE WHEN DB_NAME() IN (''master'',''msdb'',''model'',''tempdb'') THEN ''*'' + DB_NAME() ELSE DB_NAME() END AS database_name,
USER_NAME(role_principal_id) AS [Role],
USER_NAME(member_principal_id) AS [User]
FROM sys.database_principals p
INNER JOIN sys.database_role_members m
ON (p.principal_id = m.member_principal_id)
INNER JOIN sys.database_principals r
ON (m.role_principal_id = r.principal_id)
WHERE r.name NOT IN (''db_datareader'')
AND USER_NAME(member_principal_id) <> ''dbo''
AND USER_NAME(member_principal_id) NOT LIKE ''##%''
ORDER BY [Role],
[User]
;'
-- Display the result
SELECT *
FROM @result
ORDER BY database_name,
principal_name;
SQL Msg 15138: The database principal owns a schema in the database, and cannot be dropped.
Here’s my script to fix this error. This occurs when I restore a database to another server and want to remove the source server users.
DECLARE @vcSchemaName VARCHAR(128); SET @vcSchemaName = 'schema name goes here' SELECT s.name, 'ALTER AUTHORIZATION ON SCHEMA::[' + @vcSchemaName + '] TO dbo;' FROM sys.schemas s WHERE s.principal_id = USER_ID(@vcSchemaName
TSQL – Create an ASCII chart
This code shows the Symbol and HEX as well as DEC. Still to go is OCT.
WITH Symbols
AS (
SELECT -1 code,
CHAR(ASCII(' ')) Symbol
UNION ALL
SELECT code + 1,
CHAR(code + 1)
FROM Symbols
WHERE code + 1 <= 255
)
SELECT Symbol,
ASCII(Symbol) AS [DEC],
master.dbo.fn_varbintohexstr(CAST(Symbol AS VARBINARY)) AS HEX
--,(ASCII(Symbol) % 8) AS [OCT]
FROM Symbols
ORDER BY [DEC]
OPTION (MAXRECURSION 256)
SQL Agent Jobs – Listing job owners even those in AD Groups
I sometimes find job owners are from an Active Directory group. Here’s a report on how to find these. (The example code also shows one way to delete the jobs.)
USE msdb go SELECT 'EXEC sp_delete_job @job_name = ''' + sj.name + ''';' AS RunSQL, sj.name AS 'job', SUSER_SNAME(owner_sid) AS 'owner', spr.NAME AS 'proxy' --,sj.* FROM msdb.dbo.sysjobs sj LEFT JOIN msdb.dbo.sysjobsteps sjt ON sj.job_id = sjt.job_id LEFT JOIN msdb.dbo.sysproxies spr ON spr.proxy_id = sjt.proxy_id ORDER BY sj.name
