Jak używać funkcji CONCAT w programie SQL Server 2008 R2?

102

Szukałem CONCATfunkcji w SQL Server 2008 R2. I okazało się, że link do tej funkcji . Ale kiedy używam tej funkcji, daje następujący błąd:

Msg 195, poziom 15, stan 10, wiersz 7
„CONCAT” nie jest rozpoznawaną nazwą funkcji wbudowanej.

Czy CONCATfunkcja istnieje w SQL Server 2008 R2?

Jeśli nie, jak połączyć ciągi znaków w programie SQL Server 2008 R2?

Mitesh Budhabhatti
źródło
@Oded Po prostu próbuję wykonać stmt - wybierz concat ('b', 'a')
Mitesh Budhabhatti
1
@marc_s: Dokumentacja zawiera pewne wskazówki, że dotyczy programu SQL Server 2012, ale nic nie wskazuje na CONCATto, że jest to nowość w 2012 r.
Gabe,
1
Pośrednio wskazuje, że jest to rok 2012, ale strona ma kiepski interfejs użytkownika. Na stronach, na których funkcja JEST dostępna w starszych wersjach, znajduje się menu rozwijane bezpośrednio obok wersji czytanego dokumentu. Jeśli to wiesz, wiesz, że dotyczy to tylko roku 2012. Jeśli tego nie wiedziałeś, znajdziesz się w takiej samej sytuacji jak Mitesh.
John,

Odpowiedzi:

70

CONCATjest nowością w programie SQL Server 2012. Podane łącze wyjaśnia, że ​​nie jest to funkcja we wcześniejszych wersjach , w tym w wersji 2008 R2.

To, że jest częścią SQL Server 2012, można zobaczyć w drzewie dokumentów:

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 usłużnie wskazuje, że SQL Server zapewnia implementację ODBC za CONCATfunkcją .

ta.speot.is
źródło
26
Możesz użyć SELECT {fn concat ('foo', 'bar')};w poprzednich wersjach. Akceptuje jednak tylko 2 parametry.
Martin Smith
6
Lub po prostu użyj +operatora, jak @ lynn-langit wspomina w swojej odpowiedzi, którą na początku całkowicie przegapiłem, ponieważ przeczytałem tylko zaakceptowaną odpowiedź ...
Svish
7
@Svish +zachowuje się inaczej, wyniki SELECT 'A' + 'B' + 'C'vs SELECT CONCAT('A', 'B', 'C')vs SELECT 'A' + 'B' + NULLvs SELECT CONCAT('A', 'B', NULL)ABC, ABC, NULL,AB
ta.speot.is
@ ta.speot.is Dobrze wiedzieć! Chociaż w moim przypadku nie było przypadków NULL, więc +działało świetnie :)
Svish
Ta odpowiedź byłaby znacznie bardziej przydatna, gdyby zawierała informację, że zamiast tego należy użyć znaku plus. Społeczność potwierdza tę opinię - porównaj głosy upvotes z odpowiedzią @ LynnLangit :) W OP zapytano również „jak połączyć ciągi znaków w SQL Server 2008 R2?”
Honza Zidek
101

Tylko dla kompletności - w SQL 2008 użyłbyś +operatora plusa do wykonania konkatenacji ciągów.

Zapoznaj się z dokumentacją MSDN z przykładowym kodem. Począwszy od SQL 2012, możesz chcieć użyć nowej funkcji CONCAT .

Lynn Langit
źródło
46

Proponuję rzucić wszystkie kolumny, zanim je połączysz

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

To powinno działać dla Ciebie.

vasin1987
źródło
6
WSKAZÓWKA: Warto zauważyć, że jeśli rozmiar varchar nie jest określony, np. Varchar (50), sql użyje domyślnej wartości 30. Jeśli rzutowana zmienna / wartość jest większa niż domyślna, zostanie obcięta bez wywoływania błędu.
Swifty
23

CONCAT, jak stwierdzono, nie jest obsługiwane przed SQL Server 2012. Można jednak łączyć je po prostu za pomocą operatora +, zgodnie z sugestią. Ale uważaj, ten operator zgłosi błąd, jeśli pierwszy operand jest liczbą, ponieważ uważa, że ​​będzie dodawać, a nie łączyć. Aby rozwiązać ten problem, po prostu dodaj „” na początku. Na przykład

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

zgłosi błąd, ALE '' + someNumber + 'someString' + ......będzie działać dobrze.

Ponadto, jeśli są dwie liczby do połączenia, upewnij się, że dodałeś między nimi znak „”

.... + someNumber + '' + someOtherNumber + .....
kuklei
źródło
Dzięki, użycie '' + f.columnName + '' na liście kolumn to nie lada gratka!
Łukasz
2
@kuklei Na moim serwerze SQL SELECT 'varchar(' + 5 + ')'wyświetla komunikat o błędzie „Konwersja nie powiodła się podczas konwersji wartości nvarchar 'varchar (' na typ danych int”, więc myślę, że twoja odpowiedź nie jest wystarczająca.
Alexander
5

Bezpieczny spadek o wartości NULL w przybliżeniach zastępczych dla funkcji CONCAT programu SQL Server 2012

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (dwa rozwiązania) :

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

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

Te dwa rozwiązania obejmują kilka doskonałych odpowiedzi i zastrzeżeń zgłoszonych przez inne plakaty, w tym @Martin Smith, @Svish i @ vasin1987.

Te opcje dodają NULLdo ''rzutowania (pusty łańcuch), aby zapewnić bezpieczną NULLobsługę, biorąc pod uwagę różne zachowania +operatora dotyczące określonych operandów.

Należy zauważyć, że rozwiązanie funkcji skalowania ODBC jest ograniczone do 2 argumentów, podczas gdy podejście +operatora jest skalowalne do wielu argumentów w razie potrzeby.

Zwróć również uwagę na potencjalny problem zidentyfikowany przez @Swifty dotyczący domyślnego varcharrozmiaru, rozwiązany tutaj przez varchar(MAX).

Troy Sheaffer
źródło
3
(city + ', ' + state + ' ' + zip) as ctstzip for select
(city + ', ' + state + ' ' + zip) for insert

Przesyłaj lub konwertuj tylko wtedy, gdy którykolwiek typ pola różni się od innych.

Podczas wstawiania wartość musi znajdować się we właściwym miejscu, w którym należy ją wstawić. Użycie „jako” spowoduje wystąpienie błędu.

to znaczy

Insert into testtable (ctstzip) Values ((city + ', ' + state + ' ' + zip))
Antonio Perez
źródło
2

Tak, tej funkcji nie ma w sql 2008. Możesz do tego użyć operacji rzutowania.

Na przykład mamy employeestół i chcesz namez nim applydate.

więc możesz użyć

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

Będzie działać tam, gdzie funkcja concat nie działa.

M Faisal SE
źródło