Print service provided by iDogiCat: http://www.idogicat.com/
home logo





Home > IT > Database > Sql Server Notes

Sql Server Notes

List SPID and kill a process

exec sp_who2
kill <SPID>  -- when a query is too heavy and stops responding, killing it is a good idea

List all users

select * from master.sys.server_principals

Search for a function

SELECT OBJECT_NAME(sm.object_id) as name, sm.definition
FROM sys.sql_modules AS sm  
JOIN sys.objects AS o ON sm.object_id = o.object_id  
WHERE OBJECT_NAME(sm.object_id) like '%GetFxForwardsForBrokerRec%'

Search for a stored procedure

select specific_schema + '.' + routine_name as name, ROUTINE_DEFINITION as definition
from information_schema.routines 
where routine_type = 'PROCEDURE'
and definition like '%STR_TO_SEARCH%'
order by name

Show temp tables and their indexes

SELECT *
FROM tempdb.sys.sysobjects
WHERE name LIKE '%#test%'

Show definition of function

sp_helptext 'dbo.MyFunction'

Search for info in error log

EXEC master.dbo.xp_readerrorlog 0, 1, "string to search for", NULL, NULL, NULL, "desc"

Show Auth Scheme

SELECT auth_scheme FROM sys.dm_exec_connections WHERE session_id = @@spid ; 

List logins

SELECT name, type_desc, is_disabled
FROM sys.server_principals

Create a login

CREATE LOGIN login_name WITH PASSWORD = 'my password';  

Fix orphaned login

When edit the user mapping of a login, if SQL Server gives the following error:

User, group, or role 'someuser' already exists in the current database. (Microsoft SQL Server, Error: 15023)

then the login is an 'orphaned login', and need to be fixed.

The old way is to run the following command:

use MyDB;
exec sp_change_users_login 'Auto_Fix', '<login_name>'
but the above command is deprecated. The new way is as follows:

alter user <user_name> with Login = '<login_name>'

Show permissions on schemas

SELECT state_desc, permission_name, 'ON' AS prep, class_desc + '::' + SCHEMA_NAME(major_id) AS schema_name,
'TO' AS prep, USER_NAME(grantee_principal_id)
FROM sys.database_permissions AS Perm
JOIN sys.database_principals AS Prin
   ON Perm.major_ID = Prin.principal_id AND class_desc = 'SCHEMA'
WHERE major_id = SCHEMA_ID('my_dbo')

Show permissions on tables

sp_table_privileges 'table_name';  
-- note that it's the table name only, without schema. ie. you cannot write it as:
-- sp_table_privileges 'dbo.table_name';

Linked Servers

Another DB can be linked to the current DB as linked DB servers. These can be found in SQL Server Management Studio (Use SUPERMART as an example):

<DB> | Server Objects | Linked Servers | <LinkedDB>

If it doesn't work, it's possible that the linked server itself has some problems. It can be connected to diagnose the problem.

It can be deleted, and re-created.

If you get errors such as "The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "x" was unable to begin a distributed transaction" or "Error: 8501 MSDTC on server is unavailable", then you will have to start the following Windows process:

  • Distributed Transaction Coordinator

Then under Admistrative Tools -> Component Services:

  • Click on Console Root -> Component Services -> Computers -> My Computer -> Distributed Transaction Coordinator : Right click, "New window here" | Local DTC | Right click, "Properties"
  • Under the Security Tab: Enable Network DTC Access, Allow Remote Clients
  • Under Transaction Manager Communication: Check Allow Inbound & Allow Outbound
  • Clicking OK should then automatically restart the DTC service.

Stored Proc to Search All Tables (Don't use this, it might be very heavy---++!)

CREATE PROC SearchAllTables
(
    @SearchStr nvarchar(100)
)
AS
 
BEGIN
 
    -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
    -- Purpose: To search all columns of all tables for a given search string
    -- Written by: Narayana Vyas Kondreddi
    -- Site: http://vyaskn.tripod.com
    -- Updated and tested by Tim Gaunt
    -- http://www.thesitedoctor.co.uk
    -- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx
    -- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010
    -- Date modified: 03rd March 2011 19:00 GMT
    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
 
    SET NOCOUNT ON
 
    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
    SET  @TableName = ''
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
 
    WHILE @TableName IS NOT NULL
     
    BEGIN
        SET @ColumnName = ''
        SET @TableName = 
        (
            SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
            FROM     INFORMATION_SCHEMA.TABLES
            WHERE         TABLE_TYPE = 'BASE TABLE'
                AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                AND    OBJECTPROPERTY(
                        OBJECT_ID(
                            QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                             ), 'IsMSShipped'
                               ) = 0
        )
 
        WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
             
        BEGIN
            SET @ColumnName =
            (
                SELECT MIN(QUOTENAME(COLUMN_NAME))
                FROM     INFORMATION_SCHEMA.COLUMNS
                WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                    AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                    AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                    AND    QUOTENAME(COLUMN_NAME) > @ColumnName
            )
     
            IF @ColumnName IS NOT NULL
             
            BEGIN
                INSERT INTO #Results
                EXEC
                (
                    'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                )
            END
        END   
    END
 
    SELECT ColumnName, ColumnValue FROM #Results
    DROP TABLE #Results
END

Add a new login

  • Launch 'SQL Server Management Studio'
  • in left pane, go to '<server> | Security | Logins', right-click on it
  • choose 'New Login'
  • fill in name, choose authentication method
  • click 'User Mapping' in left pane, check databases to be used by this ID, and for each of the DB, check the permissions in the list below ('Database role membership for').

Debug with SQL Server Profiler

Turn on the SQL Server Profiler (File | New Trace), and run application that accesses the DB, then we can see what the application executed. It also helps to add a filter so that only the ones that we are interested in can be shown:

  • File | Properties | Events Selection | Column Filters
  • click on the column to be filtered on (usually it's 'Text Data'), enter a condition (such as 'Like', enter a pattern), and check 'Exclude rows that do not contain values'.