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?


@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ą .


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)są 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 .


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.


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 + .....

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).


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))

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.