Adsense

Friday, May 1, 2015

Dynamically Generate sp_attach_db Statement Prior to removing a SQL Server Database


--script to generate the attach statement for a database
declare @dbname as sysname
declare @sql as varchar(1000)
declare @n as integer
declare @filename as sysname

set @dbname = db_name()

declare curs cursor for
select rtrim(filename) from sysfiles

open curs

fetch next from curs into @filename
set @n = 0

print '--ATTACH SCRIPT FOR ' + @dbname
print 'sp_attach_db @dbname = N''' + @dbname + ''','

while @@fetch_status = 0
begin
       set @n = @n + 1
       print '@filename' + cast(@n as varchar) + ' = ''' + @filename + ''','
       fetch next from curs into @filename     
end

close curs
deallocate curs

Convert the run-date, run_time, and run_duration of a SQL Server job to start and stop times

The below code will allow you to view the start and stop times of SQL Server jobs

SELECT
j.name,
jh.step_name,
jh.message,
jh.server,
t.start_time,
DATEADD(second, t.duration_seconds, t.start_time) as end_time,
t.duration_seconds
FROM
(      SELECT
       instance_id,
       CAST(
       --get the date
       SUBSTRING(CAST(run_date as VARCHAR), 5, 2) + '/' +
       SUBSTRING(CAST(run_date as VARCHAR), 7, 2) + '/' +
       SUBSTRING(CAST(run_date as VARCHAR), 1, 4) + ' ' +
       --get the time
       SUBSTRING(RIGHT('000000' + CAST(run_time as VARCHAR), 6), 1, 2) + ':' +
       SUBSTRING(RIGHT('000000' + CAST(run_time as VARCHAR), 6), 3, 2) + ':' +
       SUBSTRING(RIGHT('000000' + CAST(run_time as VARCHAR), 6), 5, 2) as SMALLDATETIME) as start_time,
       --get duration in seconds
       SUBSTRING(RIGHT('000000' + CAST(run_duration as VARCHAR), 6), 1, 2) * (60 * 60) +
       SUBSTRING(RIGHT('000000' + CAST(run_duration as VARCHAR), 6), 3, 2) * (60) +
       SUBSTRING(RIGHT('000000' + CAST(run_duration as VARCHAR), 6), 5, 2) as duration_seconds
       FROM msdb.dbo.sysjobhistory) t
INNER JOIN msdb.dbo.sysjobhistory jh on t.instance_id = jh.instance_id
INNER JOIN msdb.dbo.sysjobs j on j.job_id = jh.job_id
ORDER BY t.start_time desc


Tuesday, April 21, 2015

Largest Tables in a SQL Server Database

Use the query below in any database to identify the largest tables in that database.

SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
(SUM(a.total_pages) * 8)  AS TotalSpaceKB,
(SUM(a.total_pages) * 8) /1024 / 1024 AS TotalSpaceGB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE
t.NAME NOT LIKE 'dt%'
GROUP BY t.Name, s.Name
ORDER BY (SUM(a.total_pages) * 8) desc



Monday, March 23, 2015

Diagnosing RESOURCE_SEMAPHORE wait types

Diagnosing memory problems on SQL server can be difficult.  If you want to see if your SQL Server is running low on memory check out sys.dm_exec_query_memory_grants.  Checking the requested_memory_kb will show you the number of queries that are currently waiting on memory to be granted and how much memory they are requesting.


This is a useful query to use if you see a lot of waittypes of RESOURCE_SEMAPHORE.

Tuesday, August 5, 2014

Table Analysis Made Easy

Run this query in your database to get a list of all tables, comma delimited lists of what they reference, comma delimited list of what references them, row count, and total number of stored procedures and function which reference them.

declare @t table (
dbname sysname not null,
tablename sysname not null,
records int not null,
childtables varchar(max) null,
parenttables varchar(max) null,
refcount int null)

declare @tablename sysname
declare @refcount int

insert into @t (dbname, tablename, records, childtables, parenttables)
select DB_NAME(), t.name, i.rowcnt,
STUFF(( SELECT ',' + c.name
      from sys.foreign_keys fk
      inner join sys.objects c on fk.parent_object_id = c.object_id
      where t.object_id = fk.referenced_object_id
      FOR XML PATH('')),1 ,1, '') as children,
STUFF(( SELECT ',' + c.name
      from sys.foreign_keys fk
      inner join sys.objects c on fk.referenced_object_id = c.object_id
      where t.object_id = fk.parent_object_id
      FOR XML PATH('')),1 ,1, '') as parents
from sys.objects t
inner join sysindexes i on t.object_id = i.id
where t.type = 'u'
and t.name <> 'dtproperties'
and t.name not like 'mspeer%'
and t.name not like 'mspub%'
and t.name not like 'sys%'
and i.indid in (0, 1)

order by t.name

Tuesday, July 8, 2014

View all dependencies within a SQL Server Instance

This query will show all dependencies in a SQL Server Instance.


if exists (select 1 from sys.objects where name = 'table_depend_staging')
      drop table table_depend_staging
go

create table dbo.table_depend_staging(
      referencing_database_name sysname,
      referencing_schema_name sysname,
      referencing_entity_name sysname,
      referencing_object_type varchar(2),
      referencing_object_type_desc varchar(100),
      referenced_database_name sysname,
      referenced_schema_name sysname,
      referenced_entity_name sysname,
      referenced_object_type varchar(2),
      referenced_object_type_desc varchar(100))
go

declare @dbname sysname
declare @sql nvarchar(2000)

declare curs cursor for
select name
from master.sys.databases

open curs

fetch next from curs into @dbname

/******************************************GET ALL DEPENDENCIES**************************************/

while @@FETCH_STATUS = 0
begin

set @sql =  'use ' + @dbname + '
      select
      ''' + @dbname + ''' as referencing_database_name,
      s.name as referencing_schema_name,
      o.name as referencing_entity_name,
      o.type as object_type,
      o.type_desc as object_type_desc,
      ISNULL(referenced_database_name, ''' + @dbname + ''') as referenced_database_name,
      case
            when len(referenced_schema_name) = 0 or referenced_schema_name is null then ''dbo''
            else referenced_schema_name
      end as referenced_schema_name, --often this is an emtpy string
      referenced_entity_name
      from sys.sql_expression_dependencies ed
      inner join ' + @dbname + '.sys.objects o on o.object_id = ed.referencing_id
      inner join ' + @dbname + '.sys.schemas s on s.schema_id = o.schema_id
      where referenced_class not in (12, 13) --not including 12 (ddl trigger) or 13 (system ddl trigger)'

      insert into dbo.table_depend_staging (referencing_database_name, referencing_schema_name, referencing_entity_name, referencing_object_type, referencing_object_type_desc,
      referenced_database_name, referenced_schema_name, referenced_entity_name)
      exec sp_executesql @sql

      fetch next from curs into @dbname
end

close curs

deallocate curs

declare curs cursor for
select name
from master.sys.databases

open curs

fetch next from curs into @dbname

/******************************************GET TYPE OF DEPENDENT OBJECTS**************************************/

while @@FETCH_STATUS = 0
begin

      set @sql =  'update dbo.table_depend_staging
      set referenced_object_type = o.type,
      referenced_object_type_desc = o.type_desc
      from dbo.table_depend_staging s
      inner join ' + @dbname + '.sys.objects o on o.name collate SQL_Latin1_General_CP1_CI_AS = s.referenced_entity_name collate SQL_Latin1_General_CP1_CI_AS
      where referenced_database_name = ''' + @dbname + ''''

      exec sp_executesql @sql

      fetch next from curs into @dbname
end

close curs

deallocate curs
go

if exists (select 1 from dbo.sysobjects where name = 'depend_entity_type')
      drop table depend_entity_type
go

create table dbo.depend_entity_type (
depend_entity_type_id int identity(1,1),
depend_entity_type varchar(2) not null,
depend_entity_type_desc varchar(100) not null)

insert into dbo.depend_entity_type (depend_entity_type, depend_entity_type_desc)
select distinct referenced_object_type, referenced_object_type_desc
from dbo.table_depend_staging
where referenced_object_type_desc is not null
union
select distinct referencing_object_type, referencing_object_type_desc
from dbo.table_depend_staging
where referencing_object_type_desc is not null
go

if exists (select 1 from dbo.sysobjects where name = 'depend_entity')
      drop table depend_entity
go

create table dbo.depend_entity (
depend_entity_id int identity(1,1),
depend_entity_type_id int null,
depend_entity_database sysname null,
depend_entity_schema sysname null,
depend_entity_name sysname not null)
go

insert into dbo.depend_entity (depend_entity_type_id, depend_entity_database, depend_entity_schema, depend_entity_name)
select distinct e.depend_entity_type_id, referenced_database_name, referenced_schema_name, referenced_entity_name
from dbo.table_depend_staging s
left outer join dbo.depend_entity_type e on s.referenced_object_type = e.depend_entity_type
union
select distinct e.depend_entity_type_id, referencing_database_name, referencing_schema_name, referencing_entity_name
from dbo.table_depend_staging s
left outer join dbo.depend_entity_type e on s.referencing_object_type = e.depend_entity_type
go

if exists (select 1 from dbo.sysobjects where name = 'depend_entity_relationship')
      drop table depend_entity_relationship
go

create table dbo.depend_entity_relationship (
depend_entity_relationship_id int identity(1,1),
referencing_id int not null,
referenced_id int not null,
reference_not varchar(1024) null)

insert into dbo.depend_entity_relationship (referencing_id, referenced_id)
select e.depend_entity_id as referencing_id, e2.depend_entity_id as referenced_id
from dbo.table_depend_staging s
inner join dbo.depend_entity e on e.depend_entity_database = s.referencing_database_name
      and e.depend_entity_schema = s.referencing_schema_name
      and e.depend_entity_name = s.referencing_entity_name
inner join dbo.depend_entity e2 on e2.depend_entity_database = s.referenced_database_name
      and e2.depend_entity_schema = s.referenced_schema_name
      and e2.depend_entity_name = s.referenced_entity_name

select r.depend_entity_relationship_id,
e_referencing.depend_entity_database + '.' + e_referencing.depend_entity_schema + '.' + e_referencing.depend_entity_name as referencing_object,
t_referencing.depend_entity_type_desc as referencing_object_type,
e_referenced.depend_entity_database + '.' + e_referenced.depend_entity_schema +  '.' + e_referenced.depend_entity_name as referenced_object,
isnull(t_referenced.depend_entity_type_desc, 'REFERENCED OBJECT DOESN''T EXIST') as referenced_object_type
from dbo.depend_entity_relationship r
inner join dbo.depend_entity e_referenced on e_referenced.depend_entity_id = r.referenced_id
inner join dbo.depend_entity e_referencing on e_referencing.depend_entity_id = r.referencing_id
inner join dbo.depend_entity_type t_referencing on t_referencing.depend_entity_type_id = e_referencing.depend_entity_type_id
left outer join dbo.depend_entity_type t_referenced on t_referenced.depend_entity_type_id = e_referenced.depend_entity_type_id


Thursday, July 3, 2014

Create a list of all FK's with a comma delimited list of columns in SQL Server

Running the query below will create a list of all Foreign Keys and a comma delimited list off all the fields in the relationship.  You'll want to be in the database (i.e. use a "use database" statement).



select t.name as parent_table,
c.name as child_table,
fk.name as foreign_key,
      STUFF(( SELECT  ','+ col.name
            FROM sys.columns col
            inner join sys.foreign_key_columns fkc on fkc.parent_object_id = col.object_id and fkc.parent_column_id = col.column_id
            WHERE col.object_id = t.object_id
            FOR XML PATH('')),1 ,1, '')  as foreign_key_fields
from sys.objects o
inner join sys.objects t on t.object_id = o.parent_object_id
inner join sys.foreign_keys fk on o.object_id = fk.object_id
inner join sys.objects c on fk.referenced_object_id = c.object_id
group by t.name, c.name, fk.name, t.object_id
order by fk.name