Як використовувати функцію CONCAT у SQL Server 2008 R2?


102

Я шукав CONCATфункцію в SQL Server 2008 R2. Я знайшов посилання на цю функцію . Але коли я використовую цю функцію, вона видає таку помилку:

Повідомлення 195, Рівень 15, Стан 10, рядок 7
"CONCAT" не є розпізнаваною вбудованою назвою функції.

Чи CONCATіснує функція в SQL Server 2008 R2?

Якщо ні, то як з'єднати рядки в SQL Server 2008 R2?


@Oded Я просто спробую виконати stmt - виберіть concat ('b', 'a')
Мітеш Будхабхатті

1
@marc_s: У документації є деякі вказівки , що це для SQL Server 2012, але немає ніяких ознак того, що CONCATє новим для 2012 року
Гейб

1
Це побічно вказує на те, що це 2012 рік, але сторінка погана. На сторінках, де функція IS доступна в старих версіях, є спадне місце безпосередньо біля версії документа, який ви читаєте. Якщо ви це знаєте, то знаєте, що це лише для 2012 року. Якщо ви цього не знали, ви опинитесь в тій же ситуації, що і Мітеш.
Джон

Відповіді:


70

CONCATє новим для SQL Server 2012. Посилання, яке ви надали, дає зрозуміти, що це не функція для попередніх версій , включаючи 2008 R2.

Про те, що це частина SQL Server 2012, можна побачити у дереві документів:

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 Мартін Сміт послужливо вказує на те , що SQL Server забезпечує реалізацію ODBC в CONCATфункції .


26
Ви можете використовувати SELECT {fn concat ('foo', 'bar')};в попередніх версіях. Однак приймає лише 2 параметри.
Мартін Сміт

6
Або просто скористайтеся +оператором, як @ lynn-langit згадує у своїй відповіді, яку я спочатку зовсім пропустив, бо читав лише прийняту відповідь ...
Свиш

7
@Svish +поводиться по- різному, результати SELECT 'A' + 'B' + 'C'проти SELECT CONCAT('A', 'B', 'C')проти SELECT 'A' + 'B' + NULLпроти SELECT CONCAT('A', 'B', NULL)є ABC, ABC, NULL,AB
ta.speot.is

@ ta.speot.is Добре знати! Хоча в моєму випадку не було випадків NULL, тому +працювали чудово :)
Свиш

Ця відповідь була б набагато кориснішою, якби вона містила інформацію про те, що ви повинні використовувати знак плюс. Громада підтверджує таку думку - порівняйте підсумки відповіді @ LynnLangit :) ОП також запитала "як я з'єднати рядки в SQL Server 2008 R2?"
Honza


46

Я пропоную вам віддати всі стовпці, перш ніж їх складати

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

Це має працювати для вас.


6
ПОРАДА: Варто зазначити, що якщо розмір varchar не вказаний, наприклад, varchar (50), тоді sql буде використовувати за замовчуванням 30. Якщо змінна / значення, що передається, більше за замовчуванням, воно буде усічене, не викликаючи помилки.
Швидкий

23

CONCAT, як було зазначено, не підтримується до SQL Server 2012. Однак ви можете об'єднатись просто за допомогою оператора +, як було запропоновано. Але будьте обережні, цей оператор видасть помилку, якщо перший операнд є числом, оскільки він вважає, що він буде додавати, а не об'єднувати. Щоб вирішити цю проблему, просто додайте "" попереду. Наприклад

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

підніме помилку, АЛЕ '' + someNumber + 'someString' + ......буде працювати чудово.

Крім того, якщо є два числа, які потрібно об'єднати, переконайтеся, що ви додали "" між ними

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

Дякую, використання '' + f.columnName + '' у списку стовпців працює пригощанням!
Лука

2
@kuklei На моєму сервері SQL видає SELECT 'varchar(' + 5 + ')'помилку "Не вдалося перетворити при перетворенні значення nvarchar 'varchar (' у тип даних int", тому, мабуть, ваша відповідь не відповідає.
Олександр

5

NULL безпечне падіння наближення заміни для функції CONCAT SQL Server 2012

SQL Server 2012 :

SELECT CONCAT(data1, data2)

PRE SQL 2012 (два рішення) :

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

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

Ці два рішення поєднують кілька чудових відповідей та застережень, викладених іншими плакатами, включаючи @Martin Smith, @Svish та @ vasin1987.

Ці параметри додають NULLдо ''(порожнього рядка) кастингу для безпечного NULLкерування, враховуючи різну поведінку +оператора, що стосується конкретних операндів.

Зауважте, що рішення ODBC Scaler Function обмежується двома аргументами, тоді як +операторський підхід можна масштабувати до багатьох аргументів, якщо це потрібно.

Зверніть увагу також на потенційну проблему, визначену @Swifty щодо varcharрозміру за замовчуванням, який тут виправлено varchar(MAX).


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

Лише перетворюйте або конвертуйте, якщо будь-який тип поля відрізняється від інших.

На вставці значення має бути в потрібному місці, вам потрібно його вставити. Використання "як" призведе до помилки.

тобто

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

2

Так, функція відсутня в sql 2008. Для цього можна використовувати операцію лиття.

Наприклад , ми маємо employeeтаблицю , і ви хочете nameз applydate.

щоб ви могли використовувати

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

Він буде працювати там, де функція concat не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.