Microsoft SQL
Tabelle
Spesso capita di voler creare oppure distruggere e creare delle tabelle nelle stored procedures anche se non siamo sicuri che la tabella sia presente nel db, ma allo stesso tempo non vogliamo che ci appaia l'errore "There is already an object named 'yourtable' in the database.".
In questo caso possiamo usare il comando EXIST per verificare che la tabella sia stata registrata nei sysobject:
IF NOT EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[tablename]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE [dbo].[tablename] ( columns specification );
IF EXISTS (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[tablename]')
AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[tablename];
CREATE TABLE [dbo].[tablename] ( columns specification );
XML
Generare XML
select
campo1,
campo2,
(
SELECT capmpo3, campo4
FROM tabella1
WHERE tabella1.campo3= tabella2.campo1
FOR XML PATH('tagElementoSingolo'), TYPE
) as 'tagContenitoreElementi'
FROM tabella2
ORDER BY campo2 FOR XML PATH('tagContenitore'), ROOT('tagRadice'), ELEMENTS
La direttiva TYPE in coda alla subquery indica che quel blocco di XML non deve essere ENCODATO come campo stringa ma deve essere trattato come XML.
La direttiva ELEMENTS indica che voglio una struttura del tipo <nomecampo..></nomecampo..>. Ovviamente, come sempre, il nomecampo è modificabile con la keyword as.
La direttva PATH indica l'elemento principale della query, nella subquery è "Servizio", nella query principale è "RelazioneTreMesi". E' fondamentale per definire correttamente la gerarchia del XML generato così come ROOT
(nel caso della query principale) che, se presente, aggunge un elemento contenitore denominato come specificato nel parametro.
Estrapolare un frammento XML da un campo XML
DECLARE @innerXML xml
SET @innerXML = (select top 1 campoXML from Tabella)
SELECT @innerXML.query('/PATH/CAMPO')
SELECT
[innerXML], --campo XML
p.query('.'), -- contenuto del campo XML
p.query('Oggetto/Uid'), -- Tag del campo XML selezionato
p.value('(Oggetto/Uid)[1]', 'uniqueidentifier') as Uid -- contenuto del tag del campo XML selezionato
FROM TabellaOggetti
CROSS APPLY [innerXML].nodes('.') T(p)
Indici FULL TEXT
per accelerare le ricerche in campi in campi testuali si possono usare gli indici full-text. Questi richiedono l'esecuzione dei seguenti passaggi:
1) creazione del catalogo
IF NOT EXISTS (SELECT name FROM sysfulltextcatalogs WHERE name = 'NomeDelCatalogo')
BEGIN
EXEC sp_fulltext_catalog 'ProprietaIndustrialeFTCatalog', 'create'
END
2) creazione dell'indice
exec sp_fulltext_table N'[dbo].[Sentenze]', N'create', N'NomeDelCatalogo', N'NomeDellIndice'
3) aggiunta della colonna all'indice
exec sp_fulltext_column N'[dbo].[NomeTabella]', N'NomeColonna', 'add', null,null
4) attivazione dell'indice
exec sp_fulltext_table N'[dbo].[NomeTabella]', N'activate'
5) se vogliamo forzare la ricostruzione del catalogo (magari a seguito di una qualche operazione di importazione massiva, ecc.)
sp_fulltext_catalog 'NomeDelCatalogo', 'rebuild';
sp_fulltext_catalog 'NomeDelCatalogo', 'start_full';
Commenti
i commenti si scrivono a terminare una riga con '--' mentre ad interruzione di una riga o su più righe con apertura '/*' e chiusura '*/'
- Per cambiare lo SCHEMA alle tabelle del database
- Per evitare che i file di backup crescano a dismisura
- Per selezionare un ramo di un albero rappresentato da una tabella con il riferimento al padre
- Query di riconoscimento numeri
- Per asegnare diritti ad tutte le stored senza wizard
- Per togliere i diritti al db_owner di un database ripristinato per poterlo cancellare
- Per controllare la effettiva esecuzione di un trigger
- Per riassociare gli utenti alle login dopo aver ripristinato un database
- Backup di tutti i database con uno script
- Per inviare una mail di notifica ad un operatore
- Per lanciare script da riga di comando
- Stored che elenca le connessioni attive
- Comando di kill di una connessione
- Per verificare i diritti utente
- Per capire le transazioni attive sul DB
- Errore che impedisce l'invio via e-mail di notifiche
- UPDATE utilizzando JOIN
- Estrarre Data e luogo di nascita dal codice fiscale
- Recuperare la versione precedente di una sotred procedure dal Transaction Log
- Togliere gli zeri ad un campo numerico zero-filled
- Ottenere solo le righe con il max di una colonna raggruppate per un altra senza usare GROUP BY
- Query che restituisce un calendario