Table of Contents

Programming - SQL - Microsoft SQL

Code Snippets

Get the size of all tables in a database

DECLARE @TableName VARCHAR(100)    --For storing values in the cursor
 
--Cursor to get the name of all user tables from the sysobjects listing
DECLARE tableCursor CURSOR
FOR 
select [name]
from dbo.sysobjects 
where  OBJECTPROPERTY(id, N'IsUserTable') = 1
FOR READ ONLY
 
--A procedure level temp table to store the results
CREATE TABLE #TempTable
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)
 
--Open the cursor
OPEN tableCursor
 
--Get the first table name from the cursor
FETCH NEXT FROM tableCursor INTO @TableName
 
--Loop until the cursor was not able to fetch
WHILE (@@Fetch_Status >= 0)
BEGIN
    --Dump the results of the sp_spaceused query to the temp table
    INSERT  #TempTable
        EXEC sp_spaceused @TableName
 
    --Get the next table name
    FETCH NEXT FROM tableCursor INTO @TableName
END
 
--Get rid of the cursor
CLOSE tableCursor
DEALLOCATE tableCursor
 
--Select all records so we can use the reults
SELECT *
FROM #TempTable
ORDER BY CAST(LEFT(ReservedSize,(LEN(ReservedSize) - 3)) AS INT)
 
--Final cleanup!
DROP TABLE #TempTable
 
GO

Show size of tables in tempdb

SELECT TBL.name AS ObjName 
      ,STAT.row_count AS StatRowCount 
      ,STAT.used_page_count * 8 AS UsedSizeKB 
      ,STAT.reserved_page_count * 8 AS RevervedSizeKB 
FROM tempdb.sys.partitions AS PART with(nolock)
     INNER JOIN tempdb.sys.dm_db_partition_stats AS STAT with(nolock)
         ON PART.partition_id = STAT.partition_id 
            AND PART.partition_number = STAT.partition_number 
     INNER JOIN tempdb.sys.tables AS TBL with(nolock)
         ON STAT.object_id = TBL.object_id 
ORDER BY STAT.reserved_page_count desc,TBL.name;

Generate SQL Statements

Code:

SELECT 'DROP TABLE g2user.' + name FROM sys.tables

Partial output:

DROP TABLE g2user.g2_SequenceLock
DROP TABLE g2user.g2_SequenceId
DROP TABLE g2user.g2_ExternalIdMap
DROP TABLE g2user.g2_FailedLoginsMap
DROP TABLE g2user.g2_AccessMap

Code:

SELECT 'EXECUTE sp_rename ''g2user.' + name + ''', ''' + replace(name,'g2test','g2')+ '''' FROM sys.tables

Partial output:

EXECUTE sp_rename 'g2user.g2test_SessionMap', 'g2_SessionMap'
EXECUTE sp_rename 'g2user.g2test_TkOperatnMap', 'g2_TkOperatnMap'
EXECUTE sp_rename 'g2user.g2test_TkOperatnMimeTypeMap', 'g2_TkOperatnMimeTypeMap'
EXECUTE sp_rename 'g2user.g2test_TkOperatnParameterMap', 'g2_TkOperatnParameterMap'

A DROP DATABASE line per database on the server

SELECT 'DROP DATABASE [' + name + ']' FROM SYS.Databases

Partial output:

DROP DATABASE [master]
DROP DATABASE [tempdb]
DROP DATABASE [model]
DROP DATABASE [msdb]

For all databases except the system databases:

SELECT 'DROP DATABASE [' + name + ']' FROM SYS.Databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb')

SQL Logins

Bill Graziano's SQL Server Blog - Scripting out SQL Server Logins

Associate SQL login with db login

Associate a newly created SQL login account with an existing user in a restored database:

ALTER USER loginnaam WITH LOGIN = loginnaam

Shrinking the transaction log

Transaction log multiple GB in size, database a few hundred MB and no need to keep the transaction log?

Then try the following after making a backup of the database:

BACKUP LOG [databasename] WITH truncate_only
USE [databasename]
DBCC SHRINKFILE ('databasename_log', 0)

Where databasenaam_log must be replaced by the logical name of the log (examine the properties of the database in SQL Server Management Studio).

Shrinking the transaction log on SQL Server 2012

On SQL Server 2012 (and higher?) the truncate_only option has been removed.
To remove the transaction log in SQL Server 2012 the recovery model of the database must be switched to simple and then back to full. After this you should be able to shrink the transaction log file.

Use the following SQL statement:

--Set it to simple
USE master
ALTER DATABASE [databasename] SET RECOVERY SIMPLE
 
---Set it to full
USE master
ALTER DATABASE [databasename] SET RECOVERY FULL

Sources:
sql newsgroups - Live server running out of space - Can't reduce Transaction Log!
SQL Server Log File Maintenance
Microsoft TechNet - SQL Server 2012 - BACKUP (Transact-SQL)
Microsoft TechNet - SQL Server 2012 - View or Change the Recovery Model of a Database (SQL Server)

Open transactions

If your database mode is Simple and you have a log file of several GB with no current activity on the database server to justify such a large logfile, you may have an open transaction in the log file.

Using the following you can check the ID and start date of the oldest open transaction in the log:

USE [databasename]
DBCC OPENTRAN

If there are open transactions, the result should look something like this:

Transaction information for database 'DB'.

Oldest active transaction:
    SPID (server process ID): 67
    UID (user ID) : -1
    Name          : implicit_transaction
    LSN           : (26506:575:6)
    Start time    : Sep  7 2011  8:50:07:497AM
    SID           : 
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

If there are no open transactions, the result should look like this:

No active open transactions.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

If you are sure that the open transaction is no longer necessary, you can end it with:

KILL spid

Where spid must be replaced by the server process ID from the result of DBCC OPENTRAN.
You might have to repeat this several times to kill all open transactions. Always make sure that the open transaction you want to kill isn't worth saving.
After this you can retry the log shrink.

See also:
MSDN Blogs > Blogs from Suhas > Shrinking the Transaction Log files in SQL Server

Single/Multi user mode

Place a database in single user mode:

ALTER DATABASE db-name SET SINGLE_USER

Place a database in multi-user mode:

ALTER DATABASE db-name SET MULTI_USER

Source:Set a single database into Single User Mode

Repair database

Force a database repair allowing data loss:

DBCC CHECKDB ('dbnaam', repair_allow_data_loss)

Add column to existing table

The following creates a new column with data type char(1):

ALTER TABLE tabelnaam
ADD nieuwekolomnaam char(1) 

Source:TECH on the net - SQL: ALTER TABLE Statement and MSDN - Transact-SQL Reference (SQL Server 2000) ALTER TABLE

Count lines

SELECT COUNT (*) FROM TableName

Generating an insert statement

The following snippet inserts IP-adresses starting from 10.1.12.100-10.1.12.130 to 10.1.18.100-10.1.18.130 and two 0 values to a table. Modify numbers, run once as-is and then remove the “—” before the insert to actually apply the changes to the table.

DECLARE @i INT,@i2 INT,@String VARCHAR(30)
 
SELECT @i = 12,@i2 = 100,@String = '10.1.'
 
WHILE @i <= 18
BEGIN
 
	WHILE @i2 <= 130
	BEGIN
 
		---INSERT TableName
		SELECT @String + CAST(@i AS VARCHAR) + '.' + CAST(@i2 AS VARCHAR),0,0
 
		SELECT @i2 = @i2 + 1
 
	END
 
	SELECT
		@i = @i + 1,
		@i2 = 128
 
END

Connection info

SELECT db_name(dbid) as DatabaseName,hostname,program_name,loginame,spid
---SELECT *
FROM sys.sysprocesses
WHERE dbid > 0
AND db_name(dbid) = 'databasenaam'

Or info from one of the following:

SELECT * FROM sys.dm_exec_connections 
SELECT * FROM sys.dm_exec_sessions

Show locks:

SELECT db_name(resource_database_id) AS DatabaseName,* FROM sys.dm_tran_locks

Sources:
SQL Server Curry - How to see active connections for each Database in SQL Server 2005
itechtalk - Monitoring Processes in T-SQL

Database Recovery Model

SELECT name,recovery_model_desc
FROM master.sys.databases
--WHERE recovery_model_desc LIKE '%full%'
--WHERE recovery_model_desc LIKE '%simple%'

Get a list of jobs running longer than 00:59:00

Get a list of job runs that ran longer than 59 minutes (run_duration > 5900):

SELECT *
FROM msdb.dbo.sysjobhistory
WHERE 
	step_id = 0
	AND run_duration > 5900

Generate a statement per database to get the list of files per database

SELECT 'SELECT * FROM [' + name + '].sys.database_files'
FROM sys.databases;