Qualche query T-SQL…

Parliamo del linguaggio T-SQL, un dialetto di SQL sviluppato da Microsoft in opposizione al PL/SQL che è l’analogo di Oracle.
In questo breve post descriverò tre query veramente utili (non vi è giorno in cui non le utilizzi) per la ricerca di informazioni all’interno di un database (sopratutto se il database è di grandi dimensioni e non si una una conoscenza completa sullo stesso).

Cercare tutti gli oggetti modificati meno n giorni fa

Come da titolo, questa query permette di avere informazioni su tutti gli oggetti (quindi viste, stored procedure…) che sono stati modificati meno di un numero arbitrario di giorni fa, nell’esempio seguente 20:

SELECT o.modify_date, o.name, m.definition
FROM sys.objects AS o
INNER JOIN sys.schemas AS s ON o.[schema_id] = s.[schema_id]
INNER JOIN sys.sql_modules AS m ON o.[object_id] = m.[object_id]
WHERE o.modify_date >= DATEADD(day,-20, GETDATE())

Ho aggiunto un JOIN sulla sql_modules per poter avere informazioni sul nome dell’oggetto e anche del suo contenuto.

Cercare tutti gli oggetti che contengono una stringa

Quante volte può capitare di dover ricercare nel DB tutti gli oggetti che utilizzano una determinata stored, oppure gli oggetti che contengono un commento TODO o TOFIX.
Esistono numerosi tool per eseguire tali ricerce ma spesso la soluzione più veloce e semplice è la conoscenza delle tabelle di sistema.

SELECT o.NAME AS Object_Name
, o.type_desc
, o.modify_date
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.DEFINITION LIKE '%foo%'
ORDER BY o.modify_date DESC

Cercare tra i nomi di tutte le colonne

Analogamente a quanto descritto sopra, spesso non ho la necessità di sapere se esiste una colonna con un tal nome all’interno del mio DB (sopratutto se questo è di dimensioni molto grandi e difficilmente consultabile).
Per ottenere questa informazione utilizziamo le viste Information Schema, che meriteranno un approfondimento a parte.

SELECT COLUMN_NAME, TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE '%column_name%'

Confrontare le colonne della stessa tabella tra due differenti database

Talvolta può capitare di dover verificare eventuali disallineamenti di colonne per la stessa tabella tra due database diversi (solitamente tra il database di staging e il database di produzione).
Per trovare le differenze a livello di colonne tra due diversi database viene in aiuto la seguente query.

DECLARE @table_name VARCHAR(50);
SET @table_name = 'foo_table';
SELECT 'foo.' + c2.table_name AS 'Tabella di riferimento'
    , c2.COLUMN_NAME
    , CAST(c2.data_type AS VARCHAR(30)) + '(' +
    CAST(c2.character_maximum_length AS VARCHAR(20)) + ')' AS Column_type
FROM foo.INFORMATION_SCHEMA.COLUMNS c2
WHERE table_name = @table_name
    AND c2.COLUMN_NAME NOT IN (
        SELECT column_name
        FROM bar.INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = @table_name
        )
UNION
SELECT 'bar.' + c2.table_name AS 'Tabella di riferimento'
    , c2.COLUMN_NAME
    , CAST(c2.data_type AS VARCHAR(30)) + '(' +
    CAST(c2.character_maximum_length AS VARCHAR(20)) + ')' AS Column_type
FROM bar.INFORMATION_SCHEMA.COLUMNS c2
WHERE table_name = @table_name
    AND c2.COLUMN_NAME NOT IN (
        SELECT column_name
        FROM foo.INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = @table_name
        )

Cercare tutti i processi lanciati da me in questo momento

Lavorando con query complesse spesso nasce la necessità di voler avere sottocontrollo i processi aperti e quante risorse questi stanno utilizzando sul server.

Per poter fare ciò sono dipsonibili delle stored procedure di sistema, come sp_who, sp_who2 e sp_who4.

Il codice seguente inserisce i valori forniti dalla stored sp_who2 in una tabella, in modo che questi possano essere facilmente interrogati con una query.

DECLARE @ResultSet TABLE (
    SPID INT
    , STATUS VARCHAR(100)
    , LOGIN VARCHAR(100)
    , HostName VARCHAR(100)
    , BlkBy VARCHAR(100)
    , DBName VARCHAR(100)
    , Command VARCHAR(100)
    , CPUTime INT
    , DiskIO INT
    , LastBatch VARCHAR(100)
    , ProgramName VARCHAR(100)
    , SPID2 INT
    , REQUESTID INT
    )

INSERT INTO @ResultSet
EXEC sp_who2

SELECT *
FROM @ResultSet AS rs
WHERE rs.HostName = '__your_user_name__'
    AND rs.ProgramName = 'Microsoft SQL Server Management Studio - Query'

Indice

Share
Ultimi articoli
Join

Newsletter

Nessuno spam, solo articoli interessanti ;)

Focus

Post correlati

sharding

Cosa è il database sharding?

Introduzione Ogni applicazione che utilizza un database deve pensare a come gestire un aumento delle richieste e dell’utilizzo di questa ultima senza comprometterne l’usabilità. Rendere

WITH – Common Table Expression

Le Common Table Expression forniscono una sintassi alternativa per evitare l’accumularsi di query innestate: permettono di creare delle tabelle temporanee basandosi sui risultati di una

Utilizzare la clausola ROLLUP

Talvolta voglio eseguire una query che mi fornisca dei risultati aggregati di media, min, max… ma anche dei risultati sull’intero rowset senza aggregazione. Per avere

Codice Pragmatico

Contatti

Per informazioni, dubbi o consulenze non esitate a contattarmi.

Lascia un messaggio

Ricevi le ultime news

Iscrivi alla newsletter

Solo articoli interessanti, promesso ;)