SQL Server ed ALM su database


Il blog di Alessandro Alpi
Archivio Posts
Anno 2018

Anno 2017

Anno 2016

Anno 2015

Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Creare un template "C# enum" con SSMS Boost su SQL Server

Tempo fa ho parlato di un plugin per SSMS chiamato SSMS Boost. In questo post vorrei approfondire l'utilizzo di una sua funzionalità molto comoda per la produttività giornaliera.
Osserveremo come creare un template custom utilizzando lo "Scripter Templates".

Parlando di database, esistono tabelle che contengono dati statici, usate spesso come dati di dominio o come tabelle per il controllo delle relative Foreign Key. Molto spesso accade che queste ultime siano "mappate" ad enum definiti sulla nostra applicazione. Creare alcuni di questi enumeratori può essere un'operazione noiosa (si può fare con uno script SQL ad esempio), soprattutto se il numero di elementi è elevato. Grazie a SSMS Boost, possiamo migliorare la loro generazione.

Scenario

Immaginiamo di avere la seguente tabella di dati statici:

USE tempdb;

GO

 

CREATE TABLE dbo.StaticData

(

   Code tinyint

 , Value varchar(30)

 , PRIMARY KEY

 (

   Code

 )

);

GO

 

INSERT INTO dbo.StaticData (Code, Value) VALUES (0, 'Unknown');

INSERT INTO dbo.StaticData (Code, Value) VALUES (1, 'Enabled');

INSERT INTO dbo.StaticData (Code, Value) VALUES (2, 'Disabled');

INSERT INTO dbo.StaticData (Code, Value) VALUES (3, 'Confirmed');

INSERT INTO dbo.StaticData (Code, Value) VALUES (4, 'Deleted');

INSERT INTO dbo.StaticData (Code, Value) VALUES (5, 'Replied');

INSERT INTO dbo.StaticData (Code, Value) VALUES (6, 'Asked');

INSERT INTO dbo.StaticData (Code, Value) VALUES (7, 'ToBeAsked');

INSERT INTO dbo.StaticData (Code, Value) VALUES (8, 'ToBeConfirmed');

INSERT INTO dbo.StaticData (Code, Value) VALUES (9, 'ToBeReplied');

GO



Vogliamo ottenere uno snippet C# con la seguente sintassi:

public enum Something

{

  option1 = 0,

  option2 = 1,

  optionx = 3

}



Nuovo template

Andiamo quindi a creare un nuovo template con SSMS Boost. Una volta installato, nella toolbar troverete un tasto "Extras" in cui vi è la voce "Settings":

Si aprirà la view delle impostazioni. Selezionare "ResultsGrid: Scripter Templates":

Premendo il tasto indicato nell'immagine (quello contrassegnato con il 2), creare il nuovo template, nominandolo C# Enum.
Ora siamo pronti per modificarlo.


Impostare i parametri del template

Prima di tutto, raccogliamo quanto serve per scriptare un enum:

- il tipo (opzionale, int di default) e il modificatore di accesso (useremo public)
- il nome (può cambiare per ogni script)
- gli elementi, come lista di <Nome_Senza_Spazi = Valore_Intero>
- stringhe costanti (commenti, parentesi)

Come tipo scegliamo il default.
Come nome ci sarà un SQL Server Template placeholder. Si tratta di una stringa <nome_parametro, tipo_parametro, valore_default>. Per maggiori informazioni sui template parameters, leggere qui. Useremo una stringa <enum_name, string, myEnum>.
Per quanto riguarda gli elementi, abbiamo bisogno di ottenere il set di righe e di gestire ogni riga. Per fare questo SSMS Boost ci fornisce dei placeholder dedicati, ognuno dei quali è utilizzabile all'interno delle proprietà (e a volte solo in alcune di esse). Ad esempio, abbiamo un {Rows} che torna la lista delle righe della griglia che viene considerata (o delle griglie, un set per ogni griglia).
Questo segna posto è utilizzabile sulla proprietà "Selection":


Come si può notare, abbiamo creato un template nuovo usando la sintassi comune ci C# per gli enum e applicando il template parameter descritto prima. Avremo molto bisogno di quest'ultimo, perchè ci darà la possibilità di rinominare l'enum in maniera molto veloce e semplice. Potremo decidere se farlo durante l'esecuzione della fase di template oppure dopo, una volta che il template ha prodotto il codice (premendo CTRL-SHIFT-M).
Ma andiamo nel dettaglio della proprietà "Selection":

public enum <enum_name, string, myEnum> //SQL Server template parameter

{

  {Rows} //SSMS Boost built-in parameter

}



Come scritto nella documentazione del plugin, possiamo utilizzare anche altri placeholder, come {SelectionN} che torna il progressivo della selezione corrente, o meglio della griglia corrente, di quella che sta per essere scriptata, oppure {HeadersRow} che corrisponde alla lista di colonne, se specificate nella proprietà "ColumnName".

Come possiamo definire come renderizzare ogni riga? Impostando il suo template come segue:


{Values} è la lista dei {Value} e ValueSeparator corrisponde al carattere che separa i {Value} tra loro. Imposteremo ValueSeparator a " = " (spazio-uguale-spazio), e la proprietà Row a "{Values}," (placeholder-virgola) per ottenere il pattern "value1 = value2 = value3 = valuex ... , ". Per ogni riga, fino a che esistono colonne, viene ripetuto il valore con il separatore.

ColumnNameColumnNamesSeparatorHeader e HeadersSeparator dovrebbero essere impostati a blank (non è obbligatorio, siccome la proprietà Selection non le considera, ma è una soluzione più pulita).

La proprietà Document deve essere impostata a {Selections}.
L'ultima proprietà da considerare è la "Replace Template Parameters BEFORE Scripting".


Essa indica se i template di SQL Server devono essere sostituiti MENTRE si crea il render oppure manualmente successivamente. Imposteremo la proprietà a true, in questo modo avremo il prompt durante la creazione.

 
Query sorgente e considerazioni

Il resultset che andremo a produrre per la sorgente è dato dalla seguente query, effettuata sulle tabelle definite sopra:

SELECT

    Value --> Deve essere il primo campo, corrisponde al nome di ogni elemento dell'enum

  , Code

FROM

  dbo.StaticData;


Il campo Codice è la colonna che conterrà la parte intera dell'elemento dell'enum, quella dopo l'uguale. Il campo Value conterrà il nome di ogni elemento, e proprio per questo non dovrà contenere spazi o caratteri non validi in base alle regole di scrittura del codice in C#. Nei casi in cui il campo conterrà questo tipo di caratteri, una o più REPLACE saranno necessarie direttamente nella query, per preparare al meglio la produzione del codice dell'enum. Siccome il template ripeterà ogni colonna e separerà le due con un uguale seguendo l'ordinamento con cui sono scritte nella select, è necessario che Value sia la prima e Code sia la seconda (risultato "value1 = value2,"). E altrettanto ovviamente, le colonne devono essere DUE E SOLO DUE 


Esecuzione del template

Andiamo ora a provare il nostro template, lanciando la query descritta al paragrafo precedente e premendo il tasto destro sulla griglia risultante:


Ricordiamo che la proprietà "Replace Template Parameters BEFORE Scripting" è a true, quindi dovremo indicare il nome del parametro fin da subito:


Abbiamo nella clipboard il risultato, incolliamo il contenuto e otterremo:

public enum myEnum

{

  Unknown = 0,

  Enabled = 1,

  Disabled = 2,

  Confirmed = 3,

  Deleted = 4,

  Replied = 5,

  Asked = 6,

  ToBeAsked = 7,

  ToBeConfirmed = 8,

  ToBeReplied = 9,

}


Fatto! 

Conclusioni
Abbiamo appena creato un semplice template per un C# enum. Tuttavia chiunque voglia mettersì lì a creare qualche altro interessante template è ben accetto (ad esempio altri snippet per altri linguaggi). Come possiamo ben capire, un enum non è così frequentemente creato, ma nelle esigenze di sviluppo giornaliere di ognuno di noi possono esserci un sacco di possibilità. Se avete tempo e voglia, e se trovate nuovi interessanti template, al di fuori di quelli forniti da SSMS Boost, postateli pure!

Per chi volesse usufruire del template già fatto, copiate l'xml qui sotto nella clipboard:

<?xml version="1.0" encoding="utf-16"?>
  <GridCopyTemplate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>C# Enum</Name>
    <PatchState>1</PatchState>
    <FileExtension />
    <OpenWithApplication />
    <Document>{Selections}</Document>
    <Selection>public enum &lt;enum_name, string, myEnum&gt;
    {
      {Rows}
    }
    </Selection>
    <SelectionsSeparator>\r\n-------------------\r\n</SelectionsSeparator>
    <Row>{Values},</Row>
    <RowsSeparator>\r\n</RowsSeparator>
    <Value>{Value}</Value>
    <ValuesSeparator> = </ValuesSeparator>
    <StringFormatter />
    <IntegerFormatter>
      <Format>D</Format>
    </IntegerFormatter>
    <DoubleFormatter>
      <Format>G</Format>
    </DoubleFormatter>
    <CurrencyFormatter>
      <Format>G</Format>
    </CurrencyFormatter>
    <DateTimeFormatter>
      <Format>yyyy-MM-dd HH:mm:ss.fff</Format>
    </DateTimeFormatter>
    <DateFormatter>
      <Format>yyyy-MM-dd</Format>
    </DateFormatter>
    <TimeFormatter>
      <Format>HH:mm:ss.fff</Format>
    </TimeFormatter>
    <BooleanFormatter />
    <GuidFormatter />
    <BinaryFormatter />
    <XmlFormatter />
    <SpatialFormatter />
    <UseInvariantCulture>true</UseInvariantCulture>
    <InvokeParametersReplacement>true</InvokeParametersReplacement>
  </GridCopyTemplate>

Infine è sufficiente premere il seguente pulsante per avere la nuova entry:


Stay Tuned! 

Categoria: SQL Server
lunedì, 05 mag 2014 Ore. 15.55

Messaggi collegati


Statistiche
  • Views Home Page: 487.077
  • Views Posts: 877.394
  • Views Gallerie: 502.532
  • n° Posts: 484
  • n° Commenti: 273



















Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003