Monday, July 2, 2012

Best Way to Delete multiple non unique records

Yesterday when standing with my friends we started discussing best interview questions and one of the best questions is “how to delete duplicate records if there is no unique key in table”.

So today I will tell you best way to achieve this, I heard many answers like using temp tables with while loop or cursors, sub tables etc etc. But best is CTE (Common table expression). I think CTE is most power full method wrt recussion or looping.

Coming back to the point here are two approaches:

USING CURSORS

DECLARE @Count int

DECLARE @FirstName nvarchar(50)

DECLARE @LastName nvarchar(50)

 

DECLARE dublicate_cursor CURSOR FAST_FORWARD FOR

SELECT FirstName, LastName, Count(*) - 1

FROM Users

GROUP BY FirstName, LastName

HAVING Count(*) > 1

 

OPEN dublicate_cursor

 

FETCH NEXT FROM dublicate_cursor INTO @FirstName, @LastName, @Count

 

WHILE @@FETCH_STATUS = 0

BEGIN

 

DELETE TOP(@Count) FROM Users WHERE FirstName = @FirstName AND LastName = @LastName

 

FETCH NEXT FROM dublicate_cursor INTO @FirstName, @LastName, @Count

END

 

CLOSE dublicate_cursor

DEALLOCATE dublicate_cursor

 

NOW with CTEs

 

WITH CTE (FirstName,LastName,DuplicateCount)

AS

(

SELECT FirstName,LastName,

ROW_NUMBER() OVER(PARTITION BY FirstName,LastName  ORDER BY FirstName) AS DuplicateCount

FROM Users

)

DELETE

FROM CTE

WHERE DuplicateCount > 1

Thursday, October 28, 2010

Autogenration of Stored Procedure for Insert Update delete

Many times we have to create Stored Procedures (SPs) for INSERT, UPDATE and DELETE for all database tables in any given project. These SPs does not have any business logic but just a facilitator for said operation. While preparing for my next training session on Advance T-SQL, I come across a good article on MSDN (http://msdn.microsoft.com/en-us/magazine/cc188749.aspx). This talks about, design-time automation which makes coding faster and ensures that all the procedures generated use the same naming conventions and structure.


Script to automate Insert, update and delete:

SET QUOTED_IDENTIFIER OFF


GO

SET ANSI_NULLS ON

GO













CREATE PROC pr__SYS_MakeDeleteRecordProc

@sTableName varchar(128),

@bExecute bit = 0

AS



IF dbo.fnTableHasPrimaryKey(@sTableName) = 0

BEGIN

RAISERROR ('Procedure cannot be created on a table with no primary key.', 10, 1)

RETURN

END



DECLARE @sProcText varchar(8000),

@sKeyFields varchar(2000),

@sWhereClause varchar(2000),

@sColumnName varchar(128),

@nColumnID smallint,

@bPrimaryKeyColumn bit,

@nAlternateType int,

@nColumnLength int,

@nColumnPrecision int,

@nColumnScale int,

@IsNullable bit,

@IsIdentity int,

@sTypeName varchar(128),

@sDefaultValue varchar(4000),

@sCRLF char(2),

@sTAB char(1)



SET @sTAB = char(9)

SET @sCRLF = char(13) + char(10)



SET @sProcText = ''

SET @sKeyFields = ''

SET @sWhereClause = ''



SET @sProcText = @sProcText + 'IF EXISTS(SELECT * FROM sysobjects WHERE name = ''prApp_' + @sTableName + '_Delete'')' + @sCRLF

SET @sProcText = @sProcText + @sTAB + 'DROP PROC prApp_' + @sTableName + '_Delete' + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF



SET @sProcText = @sProcText + @sCRLF



PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)



SET @sProcText = ''

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + '-- Delete a single record from ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + 'CREATE PROC prApp_' + @sTableName + '_Delete' + @sCRLF



DECLARE crKeyFields cursor for

SELECT *

FROM dbo.fnTableColumnInfo(@sTableName)

ORDER BY 2



OPEN crKeyFields



FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue



WHILE (@@FETCH_STATUS = 0)

BEGIN



IF (@bPrimaryKeyColumn = 1)

BEGIN

IF (@sKeyFields <> '')

SET @sKeyFields = @sKeyFields + ',' + @sCRLF



SET @sKeyFields = @sKeyFields + @sTAB + '@' + @sColumnName + ' ' + @sTypeName



IF (@nAlternateType = 2) --decimal, numeric

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnPrecision AS varchar(3)) + ', '

+ CAST(@nColumnScale AS varchar(3)) + ')'



ELSE IF (@nAlternateType = 1) --character and binary

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnLength AS varchar(4)) + ')'



IF (@sWhereClause = '')

SET @sWhereClause = @sWhereClause + 'WHERE '

ELSE

SET @sWhereClause = @sWhereClause + ' AND '



SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @' + @sColumnName + @sCRLF

END



FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue

END



CLOSE crKeyFields

DEALLOCATE crKeyFields



SET @sProcText = @sProcText + @sKeyFields + @sCRLF

SET @sProcText = @sProcText + 'AS' + @sCRLF

SET @sProcText = @sProcText + @sCRLF

SET @sProcText = @sProcText + 'DELETE ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + @sWhereClause

SET @sProcText = @sProcText + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF





PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)



















GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO















CREATE PROC pr__SYS_MakeInsertRecordProc

@sTableName varchar(128),

@bExecute bit = 0

AS



IF dbo.fnTableHasPrimaryKey(@sTableName) = 0

BEGIN

RAISERROR ('Procedure cannot be created on a table with no primary key.', 10, 1)

RETURN

END



DECLARE @sProcText varchar(8000),

@sKeyFields varchar(2000),

@sAllFields varchar(2000),

@sAllParams varchar(2000),

@sWhereClause varchar(2000),

@sColumnName varchar(128),

@nColumnID smallint,

@bPrimaryKeyColumn bit,

@nAlternateType int,

@nColumnLength int,

@nColumnPrecision int,

@nColumnScale int,

@IsNullable bit,

@IsIdentity int,

@HasIdentity int,

@sTypeName varchar(128),

@sDefaultValue varchar(4000),

@sCRLF char(2),

@sTAB char(1)



SET @HasIdentity = 0

SET @sTAB = char(9)

SET @sCRLF = char(13) + char(10)

SET @sProcText = ''

SET @sKeyFields = ''

SET @sAllFields = ''

SET @sWhereClause = ''

SET @sAllParams = ''



SET @sProcText = @sProcText + 'IF EXISTS(SELECT * FROM sysobjects WHERE name = ''prApp_' + @sTableName + '_Insert'')' + @sCRLF

SET @sProcText = @sProcText + @sTAB + 'DROP PROC prApp_' + @sTableName + '_Insert' + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF



SET @sProcText = @sProcText + @sCRLF



PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)



SET @sProcText = ''

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + '-- Insert a single record into ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + 'CREATE PROC prApp_' + @sTableName + '_Insert' + @sCRLF



DECLARE crKeyFields cursor for

SELECT *

FROM dbo.fnTableColumnInfo(@sTableName)

ORDER BY 2



OPEN crKeyFields





FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue



WHILE (@@FETCH_STATUS = 0)

BEGIN

IF (@IsIdentity = 0)

BEGIN

IF (@sKeyFields <> '')

SET @sKeyFields = @sKeyFields + ',' + @sCRLF



SET @sKeyFields = @sKeyFields + @sTAB + '@' + @sColumnName + ' ' + @sTypeName



IF (@sAllFields <> '')

BEGIN

SET @sAllParams = @sAllParams + ', '

SET @sAllFields = @sAllFields + ', '

END



IF (@sTypeName = 'timestamp')

SET @sAllParams = @sAllParams + 'NULL'

ELSE IF (@sDefaultValue IS NOT NULL)

SET @sAllParams = @sAllParams + 'COALESCE(@' + @sColumnName + ', ' + @sDefaultValue + ')'

ELSE

SET @sAllParams = @sAllParams + '@' + @sColumnName



SET @sAllFields = @sAllFields + @sColumnName



END

ELSE

BEGIN

SET @HasIdentity = 1

END



IF (@nAlternateType = 2) --decimal, numeric

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnPrecision AS varchar(3)) + ', '

+ CAST(@nColumnScale AS varchar(3)) + ')'



ELSE IF (@nAlternateType = 1) --character and binary

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnLength AS varchar(4)) + ')'



IF (@IsIdentity = 0)

BEGIN

IF (@sDefaultValue IS NOT NULL) OR (@IsNullable = 1) OR (@sTypeName = 'timestamp')

SET @sKeyFields = @sKeyFields + ' = NULL'

END



FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue

END



CLOSE crKeyFields

DEALLOCATE crKeyFields



SET @sProcText = @sProcText + @sKeyFields + @sCRLF

SET @sProcText = @sProcText + 'AS' + @sCRLF

SET @sProcText = @sProcText + @sCRLF

SET @sProcText = @sProcText + 'INSERT ' + @sTableName + '(' + @sAllFields + ')' + @sCRLF

SET @sProcText = @sProcText + 'VALUES (' + @sAllParams + ')' + @sCRLF

SET @sProcText = @sProcText + @sCRLF



IF (@HasIdentity = 1)

BEGIN

SET @sProcText = @sProcText + 'RETURN SCOPE_IDENTITY()' + @sCRLF

SET @sProcText = @sProcText + @sCRLF

END



IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF





PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)















GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO











CREATE PROC pr__SYS_MakeSelectRecordProc

@sTableName varchar(128),

@bExecute bit = 0

AS



IF dbo.fnTableHasPrimaryKey(@sTableName) = 0

BEGIN

RAISERROR ('Procedure cannot be created on a table with no primary key.', 10, 1)

RETURN

END



DECLARE @sProcText varchar(8000),

@sKeyFields varchar(2000),

@sSelectClause varchar(2000),

@sWhereClause varchar(2000),

@sColumnName varchar(128),

@nColumnID smallint,

@bPrimaryKeyColumn bit,

@nAlternateType int,

@nColumnLength int,

@nColumnPrecision int,

@nColumnScale int,

@IsNullable bit,

@IsIdentity int,

@sTypeName varchar(128),

@sDefaultValue varchar(4000),

@sCRLF char(2),

@sTAB char(1)



SET @sTAB = char(9)

SET @sCRLF = char(13) + char(10)



SET @sProcText = ''

SET @sKeyFields = ''

SET @sSelectClause = ''

SET @sWhereClause = ''



SET @sProcText = @sProcText + 'IF EXISTS(SELECT * FROM sysobjects WHERE name = ''prApp_' + @sTableName + '_Select'')' + @sCRLF

SET @sProcText = @sProcText + @sTAB + 'DROP PROC prApp_' + @sTableName + '_Select' + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF



SET @sProcText = @sProcText + @sCRLF



PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)



SET @sProcText = ''

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + '-- Select a single record from ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + 'CREATE PROC prApp_' + @sTableName + '_Select' + @sCRLF



DECLARE crKeyFields cursor for

SELECT *

FROM dbo.fnTableColumnInfo(@sTableName)

ORDER BY 2



OPEN crKeyFields



FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue



WHILE (@@FETCH_STATUS = 0)

BEGIN

IF (@bPrimaryKeyColumn = 1)

BEGIN

IF (@sKeyFields <> '')

SET @sKeyFields = @sKeyFields + ',' + @sCRLF



SET @sKeyFields = @sKeyFields + @sTAB + '@' + @sColumnName + ' ' + @sTypeName



IF (@nAlternateType = 2) --decimal, numeric

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnPrecision AS varchar(3)) + ', '

+ CAST(@nColumnScale AS varchar(3)) + ')'



ELSE IF (@nAlternateType = 1) --character and binary

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnLength AS varchar(4)) + ')'



IF (@sWhereClause = '')

SET @sWhereClause = @sWhereClause + 'WHERE '

ELSE

SET @sWhereClause = @sWhereClause + ' AND '



SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @' + @sColumnName + @sCRLF

END



IF (@sSelectClause = '')

SET @sSelectClause = @sSelectClause + 'SELECT'

ELSE

SET @sSelectClause = @sSelectClause + ',' + @sCRLF



SET @sSelectClause = @sSelectClause + @sTAB + @sColumnName



FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue

END



CLOSE crKeyFields

DEALLOCATE crKeyFields



SET @sSelectClause = @sSelectClause + @sCRLF



SET @sProcText = @sProcText + @sKeyFields + @sCRLF

SET @sProcText = @sProcText + 'AS' + @sCRLF

SET @sProcText = @sProcText + @sCRLF

SET @sProcText = @sProcText + @sSelectClause

SET @sProcText = @sProcText + 'FROM ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + @sWhereClause

SET @sProcText = @sProcText + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF





PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)



















GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO



















CREATE PROC pr__SYS_MakeUpdateRecordProc

@sTableName varchar(128),

@bExecute bit = 0

AS



IF dbo.fnTableHasPrimaryKey(@sTableName) = 0

BEGIN

RAISERROR ('Procedure cannot be created on a table with no primary key.', 10, 1)

RETURN

END



DECLARE @sProcText varchar(8000),

@sKeyFields varchar(2000),

@sSetClause varchar(2000),

@sWhereClause varchar(2000),

@sColumnName varchar(128),

@nColumnID smallint,

@bPrimaryKeyColumn bit,

@nAlternateType int,

@nColumnLength int,

@nColumnPrecision int,

@nColumnScale int,

@IsNullable bit,

@IsIdentity int,

@sTypeName varchar(128),

@sDefaultValue varchar(4000),

@sCRLF char(2),

@sTAB char(1)



SET @sTAB = char(9)

SET @sCRLF = char(13) + char(10)



SET @sProcText = ''

SET @sKeyFields = ''

SET @sSetClause = ''

SET @sWhereClause = ''



SET @sProcText = @sProcText + 'IF EXISTS(SELECT * FROM sysobjects WHERE name = ''prApp_' + @sTableName + '_Update'')' + @sCRLF

SET @sProcText = @sProcText + @sTAB + 'DROP PROC prApp_' + @sTableName + '_Update' + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF



SET @sProcText = @sProcText + @sCRLF



PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)



SET @sProcText = ''

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + '-- Update a single record in ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + '----------------------------------------------------------------------------' + @sCRLF

SET @sProcText = @sProcText + 'CREATE PROC prApp_' + @sTableName + '_Update' + @sCRLF



DECLARE crKeyFields cursor for

SELECT *

FROM dbo.fnTableColumnInfo(@sTableName)

ORDER BY 2



OPEN crKeyFields





FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue



WHILE (@@FETCH_STATUS = 0)

BEGIN

IF (@sKeyFields <> '')

SET @sKeyFields = @sKeyFields + ',' + @sCRLF



SET @sKeyFields = @sKeyFields + @sTAB + '@' + @sColumnName + ' ' + @sTypeName



IF (@nAlternateType = 2) --decimal, numeric

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnPrecision AS varchar(3)) + ', '

+ CAST(@nColumnScale AS varchar(3)) + ')'



ELSE IF (@nAlternateType = 1) --character and binary

SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnLength AS varchar(4)) + ')'



IF (@bPrimaryKeyColumn = 1)

BEGIN

IF (@sWhereClause = '')

SET @sWhereClause = @sWhereClause + 'WHERE '

ELSE

SET @sWhereClause = @sWhereClause + ' AND '



SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @' + @sColumnName + @sCRLF

END

ELSE

IF (@IsIdentity = 0)

BEGIN

IF (@sSetClause = '')

SET @sSetClause = @sSetClause + 'SET'

ELSE

SET @sSetClause = @sSetClause + ',' + @sCRLF

SET @sSetClause = @sSetClause + @sTAB + @sColumnName + ' = '

IF (@sTypeName = 'timestamp')

SET @sSetClause = @sSetClause + 'NULL'

ELSE IF (@sDefaultValue IS NOT NULL)

SET @sSetClause = @sSetClause + 'COALESCE(@' + @sColumnName + ', ' + @sDefaultValue + ')'

ELSE

SET @sSetClause = @sSetClause + '@' + @sColumnName

END



IF (@IsIdentity = 0)

BEGIN

IF (@IsNullable = 1) OR (@sTypeName = 'timestamp')

SET @sKeyFields = @sKeyFields + ' = NULL'

END



FETCH NEXT

FROM crKeyFields

INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType,

@nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable,

@IsIdentity, @sTypeName, @sDefaultValue

END



CLOSE crKeyFields

DEALLOCATE crKeyFields



SET @sSetClause = @sSetClause + @sCRLF



SET @sProcText = @sProcText + @sKeyFields + @sCRLF

SET @sProcText = @sProcText + 'AS' + @sCRLF

SET @sProcText = @sProcText + @sCRLF

SET @sProcText = @sProcText + 'UPDATE ' + @sTableName + @sCRLF

SET @sProcText = @sProcText + @sSetClause

SET @sProcText = @sProcText + @sWhereClause

SET @sProcText = @sProcText + @sCRLF

IF @bExecute = 0

SET @sProcText = @sProcText + 'GO' + @sCRLF





PRINT @sProcText



IF @bExecute = 1

EXEC (@sProcText)























GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO



CREATE FUNCTION dbo.fnCleanDefaultValue(@sDefaultValue varchar(4000))

RETURNS varchar(4000)

AS

BEGIN

RETURN SubString(@sDefaultValue, 2, DataLength(@sDefaultValue)-2)

END







GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO



CREATE FUNCTION dbo.fnColumnDefault(@sTableName varchar(128), @sColumnName varchar(128))

RETURNS varchar(4000)

AS

BEGIN

DECLARE @sDefaultValue varchar(4000)



SELECT @sDefaultValue = dbo.fnCleanDefaultValue(COLUMN_DEFAULT)

FROM INFORMATION_SCHEMA.COLUMNS

WHERE TABLE_NAME = @sTableName

AND COLUMN_NAME = @sColumnName



RETURN @sDefaultValue



END



GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO











CREATE FUNCTION dbo.fnIsColumnPrimaryKey(@sTableName varchar(128), @nColumnName varchar(128))

RETURNS bit

AS

BEGIN

DECLARE @nTableID int,

@nIndexID int,

@i int



SET @nTableID = OBJECT_ID(@sTableName)



SELECT @nIndexID = indid

FROM sysindexes

WHERE id = @nTableID

AND indid BETWEEN 1 And 254

AND (status & 2048) = 2048



IF @nIndexID Is Null

RETURN 0



IF @nColumnName IN

(SELECT sc.[name]

FROM sysindexkeys sik

INNER JOIN syscolumns sc ON sik.id = sc.id AND sik.colid = sc.colid

WHERE sik.id = @nTableID

AND sik.indid = @nIndexID)

BEGIN

RETURN 1

END





RETURN 0

END















GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO















CREATE FUNCTION dbo.fnTableColumnInfo(@sTableName varchar(128))

RETURNS TABLE

AS

RETURN

SELECT c.name AS sColumnName,

c.colid AS nColumnID,

dbo.fnIsColumnPrimaryKey(@sTableName, c.name) AS bPrimaryKeyColumn,

CASE WHEN t.name IN ('char', 'varchar', 'binary', 'varbinary', 'nchar', 'nvarchar') THEN 1

WHEN t.name IN ('decimal', 'numeric') THEN 2

ELSE 0

END AS nAlternateType,

c.length AS nColumnLength,

c.prec AS nColumnPrecision,

c.scale AS nColumnScale,

c.IsNullable,

SIGN(c.status & 128) AS IsIdentity,

t.name as sTypeName,

dbo.fnColumnDefault(@sTableName, c.name) AS sDefaultValue

FROM syscolumns c

INNER JOIN systypes t ON c.xtype = t.xtype and c.usertype = t.usertype

WHERE c.id = OBJECT_ID(@sTableName)

















GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO



SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO



CREATE FUNCTION dbo.fnTableHasPrimaryKey(@sTableName varchar(128))

RETURNS bit

AS

BEGIN

DECLARE @nTableID int,

@nIndexID int



SET @nTableID = OBJECT_ID(@sTableName)



SELECT @nIndexID = indid

FROM sysindexes

WHERE id = @nTableID

AND indid BETWEEN 1 And 254

AND (status & 2048) = 2048



IF @nIndexID IS NOT Null

RETURN 1



RETURN 0

END





GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

Monday, June 14, 2010

How to get tempdb space utilization

This query will let you know how much tempdb space is required by query.

 

GO

SELECT * FROM sys.dm_db_session_space_usage WHERE SESSION_ID = @@spid

GO

<Your Query>

GO

SELECT * FROM sys.dm_db_session_space_usage WHERE SESSION_ID = @@spid

 

 

Infrastructure Planning and Design for SQL Server based application

Here is the nice document by Microsoft on infrastructure planning and design for SQL Server.

 

 

Thursday, June 3, 2010

SQL Server Trace Flags

Flag

Trace Flag Description

-1

Sets trace flags for all connections. Used only with DBCC TRACEON and TRACEOFF. The setting of the Trace flag -1 is not visible with DBCC TRACESTATUS command, but work without problems.

105

SQL Server 6.5 you can use maximum 16 tables or sub queries in a single select statement. There is no documented way, to avoid this restriction, but you can use undocumented trace flag 105 for this purpose.

106

Disables line number information for syntax errors.

107

Interprets numbers with a decimal point as float instead of decimal.

110

Turns off ANSI select characteristics.

204

A backward compatibility switch that enables NON-ANSI standard behavior. E.g. previously SQL server ignored trailing blanks in the like statement and allowed queries that contained aggregated functions to have items in the group by clause that were not in the select list.

205

Report when a statistics-dependent stored procedure is being recompiled as a result of Auto Stats.

206

Provides backward compatibility for the set user statement.

208

SET QUOTED IDENTIFIER ON.

237

Tells SQL Server to use correlated sub-queries in Non-ANSI standard backward compatibility mode.

242

Provides backward compatibility for correlated sub queries where non-ANSI-standard results are desired.

243

The behavior of SQL Server is now more consistent because null ability checks are made at run time and a null ability violation results in the command terminating and the batch or transaction process continuing.

244

Disables checking for allowed interim constraint violations. By default, SQL Server checks for and allows interim constraint violations. An interim constraint violation is caused by a change that removes the violation such that the constraint is met, all within a single statement and transaction. SQL Server checks for interim constraint violations for self-referencing DELETE statements, INSERT, and multi-row UPDATE statements. This checking requires more work tables. With this trace flag you can disallow interim constraint violations, thus requiring fewer work tables.

246

Derived or NULL columns must be explicitly named in a select….INTO or create view statement when not done they raise an error. This flag avoids that.

253

Prevents ad-hoc query plans to stay in cache.

257

Will invoke a print algorithm on the XML output before returning it to make the XML result more readable.

260

Prints versioning information about extended stored procedure dynamic-link libraries (DLLs). For more information about __GetXpVersion(), see Creating Extended Stored Procedures. Scope: global or session

262

SQL 7 - Trailing spaces are no longer truncated from literal strings in CASE statements. Used after HOTFIX 891116

302

Should be used with flag 310 to show the actual join ordering. Prints information about whether the statistics page is used, the actual selectivity (if available), and what SQL Server estimated the physical and logical I/O would be for the indexes.

310

Prints information about join order. Index selection information is also available in a more readable format using SET SHOWPLAN_ALL, as described in the SET statement.

320

Disables join-order heuristics used in ANSI joins. To see join-order heuristics use flag 310. SQL Server uses join-order heuristics to reduce the no’ of permutations when using the best join order.

323

Reports on the use of update statements using UPDATE in place. Shows a detailed description of the various update methods used by SQL Server 6.5.

325

Prints information about the cost of using a non-clustered index or a sort to process an ORDER BY clause.

326

Prints information about the estimated & actual costs of sorts. Instructs the server to use arithmetic averaging when calculating density instead of a geometric weighted average when updating statistics.  Useful for building better stats when an index has skew on the leading column.  Use only for updating the stats of a table/index with known skewed data.

330

Enables full output when using the SET SHOWPLAN_ALL option, which gives detailed information about joins.

342

Disables the costing of pseudo-merge joins, thus significantly reducing time spent on the parse for certain types of large, multi-table joins. One can also use SET FORCEPLAN ON to disable the costing of pseudo-merge joins because the query is forced to use the order specified in the FROM clause.

345

Increase the accuracy of choice of optimum order when you join 6 or more tables.

506

Enforces SQL-92 standards regarding null values for comparisons between variables and parameters. Any comparison of variables and parameters that contain a NULL always results in a NULL.

610

SQL 10 – Enable the potential for minimal-logging when:

·   Bulk loading into an empty clustered index, with no nonclustered indexes

·   Bulk loading into a non-empty heap, with no nonclustered indexes

611

After SQL 9 when turned on, each lock escalation is recorded in the SQL Server error log along with the SQL Server handle number.

652

Disables read ahead for the server.

653

Disables read ahead for the current connection.

661

Disables the ghost record removal process. A ghost record is the result of a delete operation. When you delete a record, the deleted record is kept as a ghost record. Later, the deleted record is purged by the ghost record removal process. When you disable this process, the deleted record is not purged. Therefore, the space that the deleted record consumes is not freed. This behavior affects space consumption and the performance of scan operations. SCOPE: Global. If you turn off this trace flag, the ghost record removal process works correctly.

806

Cause 'DBCC-style' page auditing to be performed whenever a database page is read into the buffer pool. This is useful to catch cases where pages are being corrupted in memory and then written out to disk with a new page checksum. When they're read back in the checksum will look correct, but the page is corrupt (because of the previous memory corruption). This page auditing goes someway to catching this - especially on non-Enterprise Edition systems that don't have the 'checksum sniffer'.

809

SQL 8 – Limits the amount of Lazy Write activity.

815

Enables latch enforcement. SQL Server 8 (with service pack 4) and SQL Server 9 can perform latch enforcement for data pages found in the buffer pool cache. Latch enforcement changes the virtual memory protection state while database page status changes from "clean" to "dirty" ("dirty" means modified through INSERT, UPDATE or DELETE operation). If an attempt is made to modify a data page while latch enforcement is set, it causes an exception and creates a mini-dump in SQL Server installation's LOG directory. Microsoft support can examine the contents of such mini-dump to determine the cause of the exception. In order to modify the data page the connection must first acquire a modification latch. Once the data modification latch is acquired the page protection is changed to read-write. Once the modification latch is released the page protection changes back to read-only.

818

SQL 8 enables in memory ring buffer used to track last 2048 successful write operations.

830

SQL 9 – disable the reporting of CPU Drift errors in the SQL Server error log like SQL Server has encountered 2 occurrence(s) of I/O requests taking longer than 15 seconds to complete

834

Causes SQL Server to use Windows large-page allocations for the memory that is allocated for the buffer pool. The page size varies depending on the hardware platform, but the page size may be from 2 MB to 16 MB. Large pages are allocated at startup and are kept throughout the lifetime of the process. Trace flag 834 improves performance by increasing the efficiency of the translation look-aside buffer (TLB) in the CPU.
Flag 834 applies only to 64-bit versions of SQL Server. You must have the Lock pages in memory user right to turn on trace flag 834. You can turn on trace flag 834 only at startup.
Trace flag 834 may prevent the server from starting if memory is fragmented and if large pages cannot be allocated. Therefore, trace flag 834 is best suited for servers that are dedicated to SQL Server.
For more information about large-page support, http://msdn2.microsoft.com/en-us/library/aa366720.aspx(http://msdn2.microsoft.com/en-us/library/aa366720.aspx)

835

SQL 9 & 10. For 64 bit SQL Server. This turns off Lock pages in memory.

836

Causes SQL Server to size the buffer pool at startup based on the value of the max server memory option instead of based on the total physical memory. You can use trace flag 836 to reduce the number of buffer descriptors that are allocated at startup in 32-bit Address Windowing Extensions (AWE) mode.
Trace flag 836 applies only to 32-bit versions of SQL Server that have the AWE allocation enabled. You can turn on trace flag 836 only at startup.

845

SQL 9 & 10. For 64 bit SQL Server. This turns on Lock pages in memory.

1117

Grows all data files at once, else it goes in turns.

1118

Switches allocations in tempDB from 1pg at a time (for first 8 pages) to one extent. There is now a cache of temp tables. When a new temp table is created on a cold system it uses the same mechanism as for SQL 8. When it is dropped though, instead of all the pages being deallocated completely, one IAM page & one data page are left allocated, then the temp table is put into a special cache. Subsequent temp table creations will look in the cache to see if they can just grab a pre-created temp table. If so, this avoids accessing the allocation bitmaps completely. The temp table cache isn't huge (32 tables), but this can still lead to a big drop in latch contention in tempDB. http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-TF-1118.aspx

1180

Forces allocation to use free pages for text or image data and maintain efficiency of storage. 1197 applies only in the case of SQL 7 – SP3. Helpful in case when DBCC SHRINKFILE and SHRINKDATABASE commands may not work because of sparsely populated text, ntext, or image columns

1197

1200

Prints lock information (the process ID and type of lock requested).

1202

Insert blocked lock requests into syslocks.

1204

Returns resources and types of locks participating in a deadlock and command affected. Scope: global only

1205

More detailed information about the command being executed at the time of a deadlock. This trace flag was documented in SQL Server 7.0 Books Online, but was not documented in SQL Server 8.

1206

Used to complement flag 1204 by displaying other locks held by deadlock parties

1211

Disables lock escalation based on memory pressure, or based on number of locks. The SQL Server Database Engine will not escalate row or page locks to table locks.

Using this trace flag can generate excessive numbers of locks. This can slow the performance of the Database Engine, or cause 1204 errors (unable to allocate lock resource) because of insufficient memory. For more information, see Lock Escalation (Database Engine).

If both trace flag 1211 and 1224 are set, 1211 takes precedence over 1224. However, because trace flag 1211 prevents escalation in every case, even under memory pressure, we recommend that you use 1224. This helps avoid "out-of-locks" errors when many locks are being used. Scope: global or session

1216

SQL 7 - Disables Health reporting. Lock monitor when detects a (worker thread) resource level blocking scenario. If a SPID that owns a lock is currently queued to the scheduler, because all the assigned worker threads have been created and all the assigned worker threads are in an un-resolvable wait state, the following error message is written to the SQL Server error log:

Error 1223: Process ID %d:%d cannot acquire lock "%s" on resource %s because a potential deadlock exists on Scheduler %d for the resource. Process ID %d:% d holds a lock "%h" on this resource.

1222

Returns the resources and types of locks that are participating in a deadlock and also the current command affected, in an XML format that does not comply with any XSD schema. Scope: global only

1224

Disables lock escalation based on the number of locks. However, memory pressure can still activate lock escalation. The Database Engine escalates row or page locks to table (or partition) locks if the amount of memory used by lock objects exceeds one of the following conditions:

·   40% of the memory that is used by Db Engine, exclusive of memory allocation using Address Windowing Extension (AWE). This is applicable when the locks parameter of sp_configure is set to 0.

·   Forty percent of the lock memory that is configured by using the locks parameter of sp_configure.

If both trace flag 1211 and 1224 are set, 1211 takes precedence over 1224. However, because trace flag 1211 prevents escalation in every case, even under memory pressure, we recommend that you use 1224. This helps avoid "out-of-locks" errors when many locks are being used.

Note:Lock escalation to the table- or HoBT-level granularity can also be controlled by using the LOCK_ESCALATION option of the ALTER TABLE statement.  Scope:global or session

1261

SQL 8 - Disables Health reporting. Lock monitor when detects a (worker thread) resource level blocking scenario. If a SPID that owns a lock is currently queued to the scheduler, because all the assigned worker threads have been created and all the assigned worker threads are in an un-resolvable wait state, the following error message is written to the SQL Server error log:

Error 1229: Process ID %d:%d owns resources that are blocking processes on scheduler %d.

1400

Enables the creation of the database mirroring endpoint, which is required for setting up and using database mirroring. This trace flag is allowed only when using the –T.

1462

Turns off log stream compression and effectively reverts the behavior back to ver 9.

1603

Use standard disk I/O (i.e. turn off asynchronous I/O).

1609

Turns on the unpacking and checking of remote procedure call (RPC) information in Open Data Services. Used only when applications depend on the old behavior.

1610

Boot the SQL dataserver with TCP_NODELAY enabled.

1611

If possible, pin shared memory -- check error log for success/failure.

1704

Prints information when a temporary table is created or dropped.

1717

Causes new objects being created to be system objects.

1806

Disables instant file initialization.

1807

Allows creating a database file on a mapped or UNC network location. unsupported under SQL Server 7 & 8.

2301

Enables advanced optimizations that are specific to decision support queries. This option applies to decision support processing of large data sets.

2330

Stops the collection of statistics for sys.db_index_usage_stats.

2382

Statistics collected for system tables.

2389

SQL 9 – Tracks the nature of columns by subsequent statistics updates. When SQL Server determines that the statistics increase three times, the column is branded ascending. The statistics will be updated automatically at query compile.

2390

Does the same like 2389 even if ascending nature of the column is not known and -- never enable without 2389.

2440

Parallel query execution strategy on partitioned tables. SQL 9 – uses a single thread per partition parallel query execution strategy. In ver. 10, multiple threads can be allocated to a single partition, thus improving the query’s response time.

2505

Prevents DBCC TRACEON 208, SPID 10 errors from appearing in the error log.

2508

Disables parallel non-clustered index checking for DBCC CHECKTABLE.

2509

Used with DBCC CHECKTABLE.html to see the total count of ghost records in a table

2520

Force DBCC HELP to return syntax of undocumented DBCC statements. If 2520 is not turned on, DBCC HELP will refuse to give you the syntax stating: "No help available for DBCC statement 'undocumented statement'".

2528

Disables parallel checking of objects by DBCC CHECKDB, CHECKFILEGROUP and CHECKTABLE. By default, the degree of parallelism is automatically determined by the query processor. The maximum degree of parallelism is configured just like that of parallel queries. For more information, see max degree of parallelism Option.

Parallel DBCC should typically be left enabled. For DBCC CHECKDB, the query processor reevaluates and automatically adjusts parallelism with each table or batch of tables checked. Sometimes, checking may start when the server is almost idle. An administrator who knows that the load will increase before checking is complete may want to manually decrease or disable parallelism.

Disabling parallel checking of DBCC can cause it to take much longer to complete and if DBCC is run with the TABLOCK feature enabled and parallelism set off, tables may be locked for longer periods of time.

Scope: global or session

2537

SQL 9 & 10. Allows function ::fn_dblog to look inside all logs (not just the active log).

2542

SQL 8 – Used with Sqldumper.exe to get certain dumps. In range 254x – 255x.

2551

Adds additional information to the dump file.

2701

Sets the @@ERROR system function to 50000 for RAISERROR messages with severity levels of 10 or less. When disabled, sets the @@ERROR system function to 0 for RAISERROR messages with severity levels of 10 or less.

2861

Cache query plans for queries that have a cost of zero or near to zero.

3001

Stops sending backup entries into MSDB.

3004

Gives out more detailed information about restore & backup activities.

3031

SQL 9 - will turn the NO_LOG and TRUNCATE_ONLY options into checkpoints in all recovery modes.

3104

Causes SQL Server to bypass checking for free space.

3111

Cause LogMgr::ValidateBackedupBlock to be skipped during backup and restore operations.

3205

If a tape drive supports hardware compression, either the DUMP or BACKUP statement uses it. With this trace flag, you can disable hardware compression for tape drivers. This is useful when you want to exchange tapes with other sites or tape drives that do not support compression. Scope: global or session

3213

Trace SQL Server activity during backup process so that we will come to know which part of backup process is taking more time.

3222

Disables the read ahead that is used by the recovery operation during roll forward operations.

3226

With this trace flag, you can suppress BACKUP COMPLETED log entries going to WIN and SQL logs.

3231

SQL 8 & 9 - will turn the NO_LOG and TRUNCATE_ONLY options into no-ops in FULL/BULK_LOGGED recovery mode, and will clear the log in SIMPLE recovery mode.

3282

SQL 6.5 – Used after backup restoration fails refer to Microsoft for article Q215458.

3422

Cause auditing of transaction log records as they're read (during transaction rollback or log recovery). This is useful because there is no equivalent to page checksums for transaction log records and so no way to detect whether log records are being corrupted e careful with these trace flags - I don't recommend using them unless you are experiencing corruptions that you can't diagnose. Turning them on will cause a big CPU hit because of the extra auditing that's happening.

3502

Tracks CHECKPOINT - Prints a message to the log at the start and end of each checkpoint.

3503

Indicates whether the checkpoint at the end of automatic recovery was skipped for a database (this applies only to read-only databases).

3504

For internal testing. Will raise a bogus log-out-of-space condition from checkpoint()

3505

Disables automatic checkpoints. May increase recovery time and can prevent log space reuse until the next checkpoint is issued. Make sure to issue manual checkpoints on all read/write databases at appropriate time intervals.
Note does not prevent the internal checkpoints that are issued by certain commands, such as BACKUP.

3601

Stack trace when error raised. Also see 3603

3602

Records all error and warning messages sent to the client.

3603

SQL Server fails to install on tricore, Bypass SMT check is enabled, flags are added via registry. Also see 3601.

3604

Sends trace output to the client. This trace flag is used only when setting trace flags with DBCC TRACEON and DBCC TRACEOFF.

3605

Sends trace output to the error log.  (if SQL Server is started from CMD output also appears on the screen)

3607

Trace flag 3607 skips the recovery of databases on the startup of SQL Server and clears the TempDB. Setting this flag lets you get past certain crashes, but there is a chance that some data will be lost

3608

Prevents SQL Server from automatically starting and recovering any database except the master database. Databases will be started and recovered when accessed. Some features, such as snapshot isolation and read committed snapshot, might not work.

3609

Skips the creation of the tempdb database at startup. Use this trace flag if the device or devices on which tempdb resides are problematic or problems exist in the model database.

3610

SQL 9. Divide by zero to result in NULL instead of error.

3625

Limits the amount of information returned in error messages. For more information, see Metadata Visibility Configuration. Scope: global only

3626

Turns on tracking of the CPU data for the sysprocesses table.

3640

Eliminates the sending of DONE_IN_PROC messages to the client for each statement in a stored procedure. This is similar to the session setting of SET NOCOUNT ON, but when set as a trace flag, every client session is handled this way.

3689

Logs extended errors to errorlog when network disconnect occurs, turned off by default. Will dump out the socket error code this can sometimes give you a clue as to the root cause.

3913

SQL 7/8 – SQL Server does not update the rowcnt column of the sysindexes system table until the transaction is committed. When turned on the optimizer gets row count information from in-memory metadata that is saved to sysindexes system table when the transaction commits.

4013

This trace flag writes an entry to the SQL Server error log when a new connection is established. For each connection that occurs, the trace flag writes two entries that look like this:

Login: sa saSQL Query Analyzer(local)ODBCmaster, server process ID (SPID): 57, kernel process ID (KPID): 57.
Login: sa XANADUsaSQL Query Analyzer(local)ODBCmaster, server process ID (SPID): 57, kernel process ID (KPID): 57.

4022

If turns on, then automatically started procedures will be bypassed.

4029

Logs extended errors to errorlog when network disconnect occurs, turned off by default. Will dump out the socket error code this can sometimes give you a clue as to the root cause.

4030

Prints both a byte and ASCII representation of the receive buffer. Used when you want to see what queries a client is sending to SQL Server. You can use this trace flag if you experience a protection violation and want to determine which statement caused it. Typically, you can set this flag globally or use SQL Server Enterprise Manager. You can also use DBCC INPUTBUFFER.

4031

Prints both a byte and ASCII representation of the send buffers (what SQL Server sends back to the client). You can also use DBCC OUTPUTBUFFER.

4032

Traces the SQL commands coming in from the client. The output destination of the trace flag is controlled with the 3605/3604 trace flags.

4101

SQL 9 - Query that involves an outer join operation runs very slowly. However, if you use the FORCE ORDER query hint in the query, the query runs much faster. Additionally, the execution plan of the query contains the following text in theWarnings column:  NO JOIN PREDICATE

Turn these trace flags after HOTFIX is applied (SP2 CUP4)

4121

4606

Over comes SA password by startup. Refer to Ms article 936892.

4612

Disable the ring buffer logging - no new entries will be made into the ring buffer.

4613

Generate a minidump file whenever an entry is logged into the ring buffer.

4616

Makes server-level metadata visible to application roles. In SQL Server, an application role cannot access metadata outside its own database because application roles are not associated with a server-level principal. This is a change of behavior from earlier versions of SQL Server. Setting this global flag disables the new restrictions, and allows for application roles to access server-level metadata. Scope: global only

5302

Alters default behavior of select…INTO (and other processes) that lock system tables for the duration of the transaction. This trace flag disables such locking during an implicit transaction. 

6527

Disables generation of a memory dump on the first occurrence of an out-of-memory exception in CLR integration. By default, SQL Server generates a small memory dump on the first occurrence of an out-of-memory exception in the CLR. The behavior of the trace flag is as follows:

·   If this is used as a startup trace flag, a memory dump is never generated. However, a memory dump may be generated if other trace flags are used.

·   If this trace flag is enabled on a running server, a memory dump will not be automatically generated from that point on. However, if a memory dump has already been generated due to an out-of-memory exception in the CLR, this trace flag will have no effect. Scope: global only

7103

Disable table lock promotion for text columns. Refer to Ms article - 230044

7300

Retrieves extended information about any error you encounter when you execute a distributed query.

7501

Dynamic cursors are used by default on forward-only cursors. Dynamic cursors are faster than in earlier versions and no longer require unique indexes. This flag disables the dynamic cursor enhancements and reverts to version 6.0 behavior.

7502

Disables the caching of cursor plans for extended stored procedures.

7505

Enables version 6.x handling of return codes when calling dbcursorfetchex and the resulting cursor position follows the end of the cursor result set.

7525

Reverts to the SQL Server 7 behavior of closing nonstatic cursors regardless of the SET CURSOR_CLOSE_ON_COMMIT state in SQL Server 8.

7601

Turns on full text indexing. Together these four gather more information about full text search (indexing process) to the error log.

7603

7604

7605

7646

SQL 10. Avoids blocking when using full text indexing. An issue we experienced that full text can be slow when there is a high number of updates to the index and is caused by blocking on the docidfilter internal table.

7806

Enables a dedicated administrator connection (DAC) on SQL Svr Express. By default, no DAC resources are reserved on SQL Server Express.

8004

SQL server to create a mini dump once you enable 2551 and a out of memory condition is hit.

8011

Disables the collection of additional diagnostic information for Resource Monitor. You can use the information in this ring buffer to diagnose out-of-memory conditions. Scope: GLOBAL.

8012

Records an event in the schedule ring buffer every time that one of the following events occurs:

·   A scheduler switches context to another worker.

·   A worker is suspended or resumed.

·   A worker enters the preemptive mode or the non-preemptive mode.

You can use the diagnostic information in this ring buffer to analyze scheduling problems. For example, you can use the information in this ring buffer to troubleshoot problems when SQL Server stops responding.
Trace flag 8012 disables recording of events for schedulers. You can turn on trace flag 8012 only at startup.

8018

Disables the creation of the ring buffer, and no exception information is recorded. The exception ring buffer records the last 256 exceptions that are raised on a node. Each record contains some information about the error and contains a stack trace. A record is added to the ring buffer when an exception is raised.

8019

Disables stack collection during the record creation, has no effect if trace flag 8018 is turned on. Disabling the exception ring buffer makes it more difficult to diagnose problems that are related to internal server errors. You can turn on trace flag 8018 and trace flag 8019 only at startup.

8020

SQL Server uses the size of the working set when SQL Server interprets the global memory state signals from the operating system. Trace flag 8020 removes the size of the working set from consideration when SQL Server interprets the global memory state signals. If you use this trace flag incorrectly, heavy paging occurs, and the performance is poor. Therefore, contact Microsoft Support before you use. You can turn on trace flag 8020 only at startup

8033

SQL 9 – disable the reporting of CPU Drift errors in the SQL Server errorlog like time stamp counter of CPU on scheduler id 1 is not synchronized with other CPUs.

8202

Used to replicate UPDATE as DELETE/INSERT pair at the publisher. i.e. UPDATE commands at the publisher can be run as an "on-page DELETE/INSERT" or a "full DELETE/INSERT". If the UPDATE command is run as an "on-page DELETE/INSERT," the Logreader send UDPATE command to the subscriber, If the UPDATE command is run as a "full DELETE/INSERT," the Logreader send UPDATE as DELETE/INSERT Pair. If you turn on trace flag 8202, then UPDATE commands at the publisher will be always send to the subscriber as DELETE/INSERT pair.

8206

Supports stored procedure execution with a user specified owner name for SQL Server subscribers or without owner qualification for heterogeneous subscribers in SQL Server 8.

8207

Enables singleton updates for Transactional Replication, released with SQL Server 8 SP 1.

8501

Writes detailed information about Ms-DTC context & state changes to the log.

8599

Allows you to use a savepoint within a distributed transaction.

8602

Ignore index hints that are specified in query/procedure.

8679

Prevents the SQL Server optimizer from using a Hash Match Team operator.

8687

Used to disable query parallelism.

8721

Dumps information into the error log when AutoStat has been run.

8722

Disable all other types of hints. This includes the OPTION clause.

8744

Disables pre-fetching for the Nested Loops operator. Incorrect use of this trace flag may cause additional physical reads when SQL Server executes plans that contain the Nested Loops operator. For more information about the Nested Loops operator, see the "Logical and physical operators reference" topic in SQL Server 9 BOL.
You can turn on trace flag 8744 at startup or in a user session. When you turn on trace flag 8744 at startup, the trace flag has global scope. When you turn on trace flag 8744 in a user session, the trace flag has session scope.

8755

Disable any locking hints like READONLY. By setting this, you allow SQL Server to dynamically select the best locking hint for the query.

8783

Allows DELETE, INSERT, and UPDATE statements to honor the SET ROWCOUNT ON setting when enabled.

8816

Logs every two-digit year conversion to a four-digit year.

9134

SQL 8 – Does additional reads to test if the page is allocated & linked correctly this checks IAM & PFS. Fixes error 601 for queries under Isolation level read uncommitted.

9268

SQL 8 – When SQL Server runs a parameterized query that contains several IN clauses, each with a large number of values, SQL Server may return the following error message after a minute or more of high CPU utilization:

Server: Msg 8623, Level 16, State 1
Internal Query Processor Error: The query processor could not produce a query plan. Contact your primary support provider for more information.

http://support.microsoft.com/kb/325658 Enabling this trace flag activates the hotfix.