Come si utilizza la funzione CONCAT in SQL Server 2008 R2?


102

Stavo cercando una CONCATfunzione in SQL Server 2008 R2. Ho trovato il collegamento per questa funzione . Ma quando uso questa funzione, dà il seguente errore:

Il messaggio 195, livello 15, stato 10, riga 7
"CONCAT" non è un nome di funzione incorporata riconosciuto.

La CONCATfunzione esiste in SQL Server 2008 R2?

In caso contrario, come concatenare le stringhe in SQL Server 2008 R2?


@Oded Dò solo di provare a eseguire lo stmt - seleziona concat ('b', 'a')
Mitesh Budhabhatti

1
@marc_s: la documentazione ha qualche indicazione che è per SQL Server 2012, ma non c'è alcuna indicazione che CONCATsia nuova per il 2012.
Gabe

1
Indica indirettamente che è per il 2012, ma la pagina ha un design dell'interfaccia utente scadente. Nelle pagine in cui una funzione È disponibile nelle versioni precedenti, è presente un menu a discesa direttamente accanto alla versione del documento che stai leggendo. Se lo sai, allora sai che è solo per il 2012. Se non lo sapevi, finisci nella stessa situazione di Mitesh.
John

Risposte:


70

CONCATè una novità di SQL Server 2012. Il collegamento fornito lo chiarisce, non è una funzione nelle versioni precedenti , inclusa la 2008 R2.

Che fa parte di SQL Server 2012 può essere visto nella struttura ad albero del documento:

SQL Server 2012  
Product Documentation  
Books Online for SQL Server 2012  
Database Engine  
  Transact-SQL Reference (Database Engine)  
    Built-in Functions (Transact-SQL)  
      String Functions (Transact-SQL)  

EDIT Martin Smith sottolinea utilmente che SQL Server fornisce un'implementazione della CONCATfunzione ODBC .


26
È possibile utilizzare SELECT {fn concat ('foo', 'bar')};nelle versioni precedenti. Accetta solo 2 parametri.
Martin Smith,

6
O semplicemente usa l' +operatore, come menziona @ lynn-langit nella sua risposta, che all'inizio mi è mancato totalmente perché ho letto solo la risposta accettata ...
Svish

7
@Svish +comporta in modo diverso, i risultati relativi SELECT 'A' + 'B' + 'C'vs SELECT CONCAT('A', 'B', 'C')vs SELECT 'A' + 'B' + NULLvs SELECT CONCAT('A', 'B', NULL)sono ABC, ABC, NULL,AB
ta.speot.is

@ ta.speot.is Buono a sapersi! Sebbene nel mio caso non ci fossero casi di NULL, quindi ha +funzionato alla grande :)
Svish

Questa risposta sarebbe molto più utile se contenesse le informazioni che devi usare invece del segno più. La comunità conferma questa opinione - confronta i voti positivi della risposta di @ LynnLangit :) L'OP ha anche chiesto "come concatenare le stringhe in SQL Server 2008 R2?"
Honza Zidek

101

Solo per completezza: in SQL 2008 si utilizzerebbe l' +operatore più per eseguire la concatenazione di stringhe.

Dai un'occhiata al riferimento MSDN con il codice di esempio. A partire da SQL 2012, potresti voler utilizzare la nuova funzione CONCAT .


46

Ti suggerisco di lanciare tutte le colonne prima di concatele

cast('data1' as varchar) + cast('data2' as varchar) + cast('data3' as varchar)

Questo dovrebbe funzionare per te.


6
SUGGERIMENTO: Vale la pena notare che se una dimensione varchar non è specificata, ad esempio varchar (50), sql userà il valore predefinito di 30. Se la variabile / il valore di cui si esegue il cast è maggiore del valore predefinito, verrà troncato senza generare un errore.
Swifty

23

CONCAT, come affermato, non è supportato prima di SQL Server 2012. Tuttavia è possibile concatenare semplicemente utilizzando l'operatore + come suggerito. Ma attenzione, questo operatore genererà un errore se il primo operando è un numero poiché pensa che aggiungerà e non concatenerà. Per risolvere questo problema basta aggiungere "" davanti. Per esempio

someNumber + 'someString' + .... + lastVariableToConcatenate

solleverà un errore MA '' + someNumber + 'someString' + ......funzionerà perfettamente.

Inoltre, se ci sono due numeri da concatenare assicurati di aggiungere un "" tra di loro, in questo modo

.... + someNumber + '' + someOtherNumber + .....

Grazie, l'uso di "+ f.columnName +" nell'elenco delle colonne funziona a meraviglia!
Luca

2
@kuklei Sul mio server SQL, SELECT 'varchar(' + 5 + ')'genera l'errore "Conversione non riuscita durante la conversione del valore nvarchar 'varchar (' in tipo di dati int", quindi immagino che la tua risposta non sia valida.
Alexander

5

Caduta sicura NULL nelle approssimazioni di sostituzione per la funzione CONCAT di SQL Server 2012

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (due soluzioni) :

SELECT {fn CONCAT(ISNULL(data1, ''), ISNULL(data2, ''))}

SELECT ISNULL(CAST(data1 AS varchar(MAX)), '') + ISNULL(CAST(data2 AS varchar(MAX)), '')

Queste due soluzioni raccolgono diverse risposte eccellenti e avvertimenti sollevati da altri poster tra cui @Martin Smith, @Svish e @ vasin1987.

Queste opzioni si aggiungono NULLal ''casting (stringa vuota) per una NULLgestione sicura tenendo conto del comportamento variabile +dell'operatore relativo a specifici operandi.

Si noti che la soluzione della funzione Scaler ODBC è limitata a 2 argomenti mentre l' approccio +dell'operatore è scalabile a molti argomenti secondo necessità.

Nota anche il potenziale problema identificato da @Swifty riguardo alla varchardimensione predefinita qui risolta da varchar(MAX).


3
(city + ', ' + state + ' ' + zip) as ctstzip for select
(city + ', ' + state + ' ' + zip) for insert

Trasmetti o converti solo se un tipo di campo è diverso dagli altri.

All'inserimento il valore deve essere nel punto corretto in cui è necessario inserirlo. L'utilizzo di "as" ti darà un errore.

vale a dire

Insert into testtable (ctstzip) Values ((city + ', ' + state + ' ' + zip))

2

Sì, la funzione non è in sql 2008. È possibile utilizzare l'operazione cast per farlo.

Ad esempio abbiamo employeetavolo e vuoi namecon applydate.

così puoi usare

Select   cast(name as varchar) + cast(applydate as varchar) from employee

Funzionerà dove la funzione concat non funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.