Как использовать функцию CONCAT в SQL Server 2008 R2?

102

Я искал CONCATфункцию в SQL Server 2008 R2. Я нашел ссылку на эту функцию . Но когда я использую эту функцию, выдает следующую ошибку:

Msg 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 год, но у страницы плохой дизайн пользовательского интерфейса. На страницах, где функция доступна в более старых версиях, есть раскрывающийся список непосредственно рядом с версией документа, который вы читаете. Если вы это знаете, значит, вы знаете, что это только на 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функции .

ta.speot.is
источник
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. это полезно знать! Хотя в моем случае случаев не было NULL, поэтому +отлично поработали :)
Свиш
Этот ответ был бы намного полезнее, если бы он содержал информацию, которую вы должны использовать вместо знака плюс. Сообщество подтверждает это мнение - сравните результаты ответа @ LynnLangit :) OP также спросил: «Как мне объединить строки в SQL Server 2008 R2?»
Хонза Зидек
101

Просто для полноты - в SQL 2008 вы использовали бы +оператор плюс для выполнения конкатенации строк.

Взгляните на ссылку MSDN с образцом кода. Начиная с SQL 2012, вы можете использовать новую функцию CONCAT .

Линн Лангит
источник
46

Я предлагаю вам преобразовать все столбцы, прежде чем объединять их

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

Это должно сработать для вас.

vasin1987
источник
6
СОВЕТ: стоит отметить, что если размер varchar не указан, например, varchar (50), тогда sql будет использовать значение по умолчанию 30. Если приводимая переменная / значение больше значения по умолчанию, оно будет усечено без возникновения ошибки.
Swifty
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

Приведение или преобразование только в том случае, если какой-либо тип поля отличается от других.

При вставке значение должно быть в нужном месте. Использование «as» приведет к ошибке.

т.е.

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 не работает.

M Faisal SE
источник