Search

Tuesday, April 3, 2012

How to restore single table from backup

You cannot restore the individual table(s) from a database backup! 

So, you had to follow the following steps to restore single table from Backup: 

1. Drop the corrupt table from your existing database. 
2. Restore your database from a backup under a different name (for example, test_db). 
3. Use DTS/Data Transformation Wizard to move/copy table from a newly restored test_db to your production database. 

This is the simplest way to implement what you require.  

Monday, April 2, 2012

Find the number of days in a month

With the help of built in SQL Server functions we can easily achieve this as shown below.

Select Day(DateAdd(Month, 1, '01/01/2012') - Day(DateAdd(Month, 1, '02/01/2012')))
Generalized Solution:

We can generalize it by creating a "User defined Stored Procedure" as shown below:

Create Function DaysInMonth (@dtDate datetime) returns int
as
Begin
Return(Select Day(DateAdd(Month, 1, @dtDate) - Day(DateAdd(Month, 1, @dtDate))))
End
Go


Saturday, March 31, 2012

List tables which are dependent on a given table

Option 1: Right-click on a table and choose 'View Dependencies'.

Option 2: For some reason if you want to do it programmatically check out the below code snippet

Select
S.[name] as 'Dependent_Tables'
From
sys.objects S inner join sys.sysreferences R 
on S.object_id = R.rkeyid
Where S.[type] = 'U' AND R.fkeyid = OBJECT_ID('Person.StateProvince')
 

Friday, March 30, 2012

Reclaiming the table space after dropping a column [without clustered index]

If we drop a column it gets dropped but the space which it was occupying stays as it is! In this article we would see the way to reclaim the space for a table which has a non-clustered Index.


Create a table with non-clustered index in it:

Create Table tblDemoTable_nonclustered (
[Sno] int primary key nonclustered,
[Remarks] varchar(5000) not null
)
Go


Pump-in some data into the newly created table:

Set nocount on
Declare @intRecNum int
Set @intRecNum = 1

While @intRecNum <= 15000 

Begin 
Insert tblDemoTable_nonclustered (Sno, Remarks ) Values (@intRecNum, convert(varchar,getdate(),109)) 
Set @intRecNum = @intRecNum + 1 
End 

Check the fragmentation info before dropping the column:

DBCC SHOWCONTIG ('dbo.tblDemoTable_nonclustered')
GO

Output:

DBCC SHOWCONTIG scanning 'tblDemoTable_nonclustered' table...
Table: 'tblDemoTable_nonclustered' (1781581385); index ID: 0, database ID: 9
TABLE level scan performed.
- Pages Scanned................................: 84
- Extents Scanned..............................: 12
- Extent Switches..............................: 11
- Avg. Pages per Extent........................: 7.0
- Scan Density [Best Count:Actual Count].......: 91.67% [11:12]
- Extent Scan Fragmentation ...................: 41.67%
- Avg. Bytes Free per Page.....................: 417.4
- Avg. Page Density (full).....................: 94.84%
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Drop the Remarks column and reindex the table:

Alter table tblDemoTable_nonclustered drop column Remarks
go

DBCC DBREINDEX ( 'dbo.tblDemoTable_nonclustered' )
Go

Now check the Fragmentation info:

DBCC SHOWCONTIG ('dbo.tblDemoTable_nonclustered')
GO

Output:

DBCC SHOWCONTIG scanning 'tblDemoTable_nonclustered' table...
Table: 'tblDemoTable_nonclustered' (1781581385); index ID: 0, database ID: 9
TABLE level scan performed.
- Pages Scanned................................: 84
- Extents Scanned..............................: 12
- Extent Switches..............................: 11
- Avg. Pages per Extent........................: 7.0
- Scan Density [Best Count:Actual Count].......: 91.67% [11:12]
- Extent Scan Fragmentation ...................: 41.67%
- Avg. Bytes Free per Page.....................: 417.4
- Avg. Page Density (full).....................: 94.84%
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

If you see there won't be any difference or rather the space hasn't reclaimed yet. 
Here, DBCC DBREINDEX won't work as nonclustered index are stored in heap. i.e., Heaps are tables that have no clustered index.

Solution:

Select * into #temp from tblDemoTable_nonclustered
Go

Truncate table tblDemoTable_nonclustered
Go

Insert into tblDemoTable_nonclustered select * from #temp
Go

Now check the fragmentation info to see that we have actually reclaimed the space!

DBCC SHOWCONTIG scanning 'tblDemoTable_nonclustered' table...
Table: 'tblDemoTable_nonclustered' (1781581385); index ID: 0, database ID: 9
TABLE level scan performed.
- Pages Scanned................................: 25
- Extents Scanned..............................: 7
- Extent Switches..............................: 6
- Avg. Pages per Extent........................: 3.6
- Scan Density [Best Count:Actual Count].......: 57.14% [4:7]
- Extent Scan Fragmentation ...................: 57.14%
- Avg. Bytes Free per Page.....................: 296.0
- Avg. Page Density (full).....................: 96.34%
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Thursday, March 29, 2012

Get File Date

This procedure gets the date a file was updated, as reported by the file system. 
exec sp_configure 'show advanced options', 1;  

reconfigure;  
exec sp_configure 'xp_cmdshell',1;  
reconfigure;  
go  
  
use master  
go  
  
create procedure [dbo].[get_file_date](  
@file_name varchar(max)  
,@file_date datetime output  
) AS   
BEGIN   
set dateformat dmy  
declare @dir table(id int identity primary key, dl varchar(2555))  
declare @cmd_name varchar(8000),@fdate datetime,@fsize bigint, @fn varchar(255)  
set @fn=right(@file_name,charindex('\',reverse(@file_name))-1)  
set @cmd_name='dir /-C "'+@file_name+'"'  
  
insert @dir  
exec master..xp_cmdshell @cmd_name  
  
select @file_date=convert(datetime,ltrim(left(dl,charindex('   ',dl))),103)   
from @dir where dl like '%'+@fn+'%'  
  
end  
go  


Usage:


declare @file_date_op datetime   
exec master.dbo.get_file_date   
  @file_name = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\MSDBData.mdf'  
 ,@file_date = @file_date_op OUTPUT  
  
SELECT @file_date_op