Sei in: Home : Competenze : SQL : Microsoft SQL

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 '*/'