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

ANSI PADDING - Valore di default database

Questa mattina ho iniziato a generare uno script di database con lo Script Wizard di SQL Server Management Studio.
si parla di ANSI_PADDING e del suo setting di default..
Dopo la prima pagina di benvenuto (facoltativa, se si è precedentemente spuntato il flag "non mostrare.."), appare la seguente:


L'ho tagliata perchè quello che mi interessa è la prima opzione, ANSI PADDING, di default impostata a True.
Per curiosità ho controllato le opzioni di tutti i miei database, per capire se potessero esserci problemi nella migrazione, perchè mi sembrava che il setting fosse impostato diversamente.
Ebbene, ogni database aveva l'opzione a False:


Controllo poi sui Books Online se trovo qualcosa.. Trovo questo link sulla documentazione. 
Leggo quindi
Nota importante Importante

In una versione futura di MicrosoftSQL Server ANSI_PADDING sarà sempre impostato su ON e qualsiasi applicazione che la imposta in modo esplicito su OFF restituirà un errore. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.


e ancora
Nota Nota

È consigliabile impostare l'opzione ANSI_PADDING sempre su ON.


e ancora
"L'impostazione predefinita di SET ANSI_PADDING è ON."

La maggior parte dei database che vedo (SQL Server 2008 10.0.4000) no.. non ho mai avuto l'esigenza di cambiare quell'impostazione e quindi il default è OFF in creazione..
Ho provato anche su altri SQL Server 2008, 2005 ed è sempre OFF(false).

Nonostante questo però, ogni volta che si esegue uno script in cui, ad esempio, creo tabelle e scrivo spazi alla fine del contenuto di un campo varchar, ottengo sempre il comportamento di ANSI_PADDING impostato ad ON. Anche quando si usano le funzioni del designer per le tabelle, ogni script generato "sotto" ed in generale ogni script di creazione/modifica delle tabelle stesse possiede in testa questo SET statement:

Il fatto fuorviante, almeno dal mio punto di vista, è che anche se l'opzione a database è OFF ogni nostra query gira in realtà con quello che management studio ha deciso come default di esecuzione. Se infatti aprite il menu tools -> Options.. alla voce Query Execution -> SQL Server -> ANSI, noterete che è spuntata la SET ANSI PADDING. Il che significa che ad ogni esecuzione Management studio ridefinisce in connessione l'impostazione di default del database, basandosi su quelle spunte (immagine sotto). Provate questo script togliendo la spunta e poi rimettendola (aprite per ogni caso una nuova query per applicare le impostazioni):

script:

EXEC master.sys.sp_dboption @dbname = 'colibri_dev',   @optname = 'ansi padding'

CREATE TABLE #foo (val varchar(20))

INSERT INTO #foo VALUES ('CIAO  ')

SELECT val + '*' FROM #foo;

DROP TABLE #foo;

go


Caso 1, ON:

la db option è OFF, ma il comportamento è da ANSI_PADDING = ON (gli spazi alla fine di un varchar non sono rimossi)

Caso 2, OFF:

la db option è sempre OFF, e il comportamento è da ANSI_PADDING = OFF (spazi rimossi).

Questa cosa mi ha lasciato un po' perplesso, però, siccome il default di SSMS è ON, si può arrivare a dire di "non preoccuparsi". Forse perchè siamo abituati a non togliere gli spazi finali di un varchar (vale anche per gli zero finale di un varbinary). Ma il fatto che il comportamento sia implicito può ingannare chi deve applicare il comportamento OFF aspettandosi di utilizzare quello impostato nel database. Alla fine è sempre la connessione che decide e quindi tenete conto di quella finestra se volete cambiare il comportamento di default. Resta il fatto che la documentazione sconsiglia di impostarlo ad OFF.

Stay Tuned! 


Categoria: SQL Server 2008
giovedì, 12 gen 2012 Ore. 09.03

Messaggi collegati


Statistiche
  • Views Home Page: 599.571
  • Views Posts: 1.065.388
  • Views Gallerie: 637.597
  • n° Posts: 484
  • n° Commenti: 273



















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