2013-10-29 44 views

risposta

43

Per rispondere alla domanda "v'è alcuna preferenza/differenza":

Sì, ci sono tante preferenze quanti sono i pareri, ma attenzione le cui preferenze si adotta.

Come best practice, è consigliabile scrivere SQL portatile se non richiede alcuno sforzo aggiuntivo.

Per il vostro campione specifico, è altrettanto facile scrivere una query portatile:

select OrderId as "Order Id" from Orders 

che scrivere un non-portatile uno:

select OrderId as [Order Id] from Orders 

Non è giustificabile di scrivere SQL non standard quando esiste una forma portatile equivalente con lo stesso numero di sequenze di tasti.

La proliferazione di [] per l'escaping è dovuta a strumenti come SQL Server Management Studio e ai creatori di query di MS Access, che sfuggono pigramente a tutto. Potrebbe non accadere mai a uno sviluppatore che spende la sua carriera in SQL Server, ma le parentesi hanno causato un sacco di spese nel corso degli anni porting di applicazioni Access e SQL Server su altre piattaforme di database. Lo stesso vale per gli strumenti Oracle che citano tutto. Gli sviluppatori inesperti vedono il DDL come esempi e quindi procedono a utilizzare lo stesso stile quando scrivono a mano. È un ciclo difficile da interrompere fino a quando gli strumenti non migliorano e noi chiediamo di meglio. In Oracle, la citazione, combinata con l'involucro misto, genera database sensibili al maiuscolo/minuscolo. Ho visto progetti in cui le persone citavano ogni identificatore nel database e avevo la sensazione di trovarmi in The Land of The Lost, dove gli sviluppatori si erano evoluti su un'isola senza documentazione o articoli di best practice.

Se si scrive il DDL, dall'inizio, con identificatori legali normalizzati (utilizzare OrderId o order_Id anziché [Order Id], non si preoccupa della parola chiave mitica che potrebbe richiedere caratteri di escape; ti informo quando hai utilizzato una parola riservata. Posso contare su un dito le volte in cui abbiamo aggiornato un'app da una versione di SQL Server a un'altra e ho avuto un'interruzione dovuta a nuove parole riservate.

Questo è spesso oggetto di accesi dibattiti, quindi se ci pensate in un altro modo:

I programmatori C# non sfuggono tutte le loro variabili con @, anche se è le ragazza per farlo. Sarebbe considerata una pratica strana e sarebbe oggetto di ridicolo su StackOverflow. La fuga dovrebbe essere per i casi limite. Ma gli stessi sviluppatori che scrivono gli identificatori C# conformi non si preoccupano di sfuggire a ogni singolo identificatore nel loro SQL, scrivendo un "codice" SQL terribilmente brutto e non portatile. Come consulente, ho incontrato più di un programmatore di SQL Server che onestamente pensava [] fosse necessaria la sintassi. Non incolpo degli sviluppatori, do la colpa agli strumenti.

+3

Upvote per parlare di standard e portabilità tra i sistemi –

+1

Esempio correlato per evitare pratiche errate in SQL: "I programmatori C# non sfuggono a tutte le loro variabili con @, anche se è legale farlo". – RBT

+1

Anche da me. Per essere onesti, penso che Microsoft si attenga alle Square Bracket sia per infastidire tutti gli altri sia per rendere la migrazione un po 'più difficile. – Manngo

1

approccio La citazione permette di fare questo:

SELECT 1 AS 'bla[]bla' 
+0

o questo: 'selezionare 1 come [bla'bla]' –

+1

Come ['QUOTENAME'] (http://technet.microsoft.it/it/us/library/ms176114.aspx) mostra, è possibile delimitare un nome contenente parentesi quadre usando il formato parentesi quadre: '[bla []] bla]' –

+1

La quotazione è per wusses, e IBM è d'accordo, vedi [ cosa puoi fare con una tabella chiamata da] (https://books.google.com/books?id=EoSNYVb5LAsC&pg=PA8&lpg=PA8&dq=sql+%22select+da+from%22&source=bl&ots=-dRlUey7CR&sig=YdwWlfCwspfYYyfQk6n9DuOFMYY&hl=en&sa= X & ei = AG6VVZvGJ8fNsAWdxYqwAg & ved = 0CDcQ6AEwBA # v = onepage & q = sql% 20% 22seleziona% 20da% 20da% 22 & f = falso) o [con una tabella chiamata dove] (https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/the_mysterious_case_of_the_empty_where49? lang = en), in DB2. – davidbak

3

virgolette singole sono più leggibili. Come dimostrato sopra, evidenziato in rosso.

MySQL utilizza `backtick` per evitare caratteri speciali.

MSSQL può usare sia "virgolette doppie" o [parentesi] per gli identificatori (tabelle, colonne, ecc)
e 'virgolette singole' per stringhe di caratteri o alias.

Le parentesi quadre sono utilizzate principalmente per incapsulare gli oggetti in modo che caratteri speciali quali spazi, punti o trattini non generino errori di sintassi.

Si consiglia di utilizzare la parola chiave 'as' prima degli alias della colonna: è molto più leggibile.

select [column with spaces] as 'my col' from "table with spaces" where n = 'foo' 
select "column with spaces" as 'my col' from [table with spaces] where n = 'foo' 
+1

Ciao Mike, la tua risposta è errata, SQL Server usa virgolette (e parentesi) per identificatori, non virgolette singole. Le virgolette singole vengono utilizzate per la citazione di valori stringa e alias, ma non nomi oggetto (tabelle, colonne). – codenheim

+0

Grazie, ho aggiornato la mia risposta per essere più specifica e ho aggiunto altri esempi. –

+0

Cheers, downvote invertito! – codenheim

4

Dipende da quali impostazioni sono in vigore se ' s sono valide o meno. E ti sei perso ". Vedere Delimited Identifiers:

Quando QUOTED_IDENTIFIER è impostata su ON, SQL Server segue le regole ISO per l'uso di doppie virgolette (") e la virgoletta singola (') in istruzioni SQL, ad esempio:.

  • Le virgolette doppie possono essere utilizzate solo per delimitare gli identificatori. Essi non possono essere utilizzati per delimitare le stringhe di caratteri.

  • virgolette singole devono essere utilizzati per racchiudere le stringhe di caratteri. Essi non possono essere utilizzati per delimitare gli identificatori.


Quando QUOTED_IDENTIFIER è impostata su OFF, SQL Server utilizza le seguenti regole per le virgolette singole o doppie virgolette:

  • virgolette non possono essere utilizzati per delimitare gli identificatori. Invece, le parentesi devono essere usate come delimitatori.

  • È possibile utilizzare virgolette singole o doppie per racchiudere le stringhe di caratteri.

E infine:

delimitatori tra parentesi può sempre essere utilizzato, indipendentemente dall'impostazione di QUOTED_IDENTIFIER

Dove, in tutte le citazioni di cui sopra, quando si riferiscono a parentesi stanno parlando di parentesi [].

+0

Questo non influisce su come 'selezionare 1 come 'foo'' è interpretato. –

Problemi correlati