Поделиться через


+ (объединение строк) (Transact-SQL)

Оператор в строковом выражении, объединяющий две или более символьных или двоичных строки, два или более столбцов или несколько строк и имен столбцов в одно выражение (строковый оператор).

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

expression + expression

Аргументы

  • expression
    Любое действительное выражение любого типа данных в категории символьных и двоичных данных, за исключением типов данных image, ntext или text. Оба выражения должны быть одного типа данных, либо должна иметься возможность неявного преобразования типа данных одного выражения в тип данных другого выражения.

    При сцеплении двоичных строк с любыми символами между двоичными строками необходимо использовать явное преобразование в символьные данные. В следующем примере показано, когда с двоичным объединением необходимо использовать функции CONVERT или CAST, а когда они могут не применяться.

    DECLARE @mybin1 varbinary(5), @mybin2 varbinary(5)
    SET @mybin1 = 0xFF
    SET @mybin2 = 0xA5
    -- No CONVERT or CAST function is required because this example 
    -- concatenates two binary strings.
    SELECT @mybin1 + @mybin2
    -- A CONVERT or CAST function is required because this example
    -- concatenates two binary strings plus a space.
    SELECT CONVERT(varchar(5), @mybin1) + ' ' 
       + CONVERT(varchar(5), @mybin2)
    -- Here is the same conversion using CAST.
    SELECT CAST(@mybin1 AS varchar(5)) + ' ' 
       + CAST(@mybin2 AS varchar(5))
    

Типы результата

Возвращает тип данных аргумента с самым высоким приоритетом. Дополнительные сведения см. в разделе Приоритет типов данных (Transact-SQL).

Замечания

При работе с пустыми строками нулевой длины оператор + (объединение строк) ведет себя иначе, чем при работе со значениями NULL или с неизвестными значениями. Символьная строка символа нулевой длины может быть указана в виде двух одинарных кавычек без каких-либо символов между ними. Двоичная строка нулевой длины может быть указана как 0x без указания каких-либо байтовых значений в шестнадцатеричной константе. При сцеплении строки нулевой длины всегда сцепляются две указанные строки. При работе со строками со значением NULL результат объединения зависит от настроек сеанса. При присоединении нулевого значения к известному значению результатом будет неизвестное значение, объединение строк с нулевым значением также дает нулевое значение, как и в арифметических действиях с нулевыми значениями. Однако можно изменить данное поведение, поменяв настройку CONCAT_NULL_YIELDS_NULL для текущего сеанса. Дополнительные сведения см. в разделе SET CONCAT_NULL_YIELDS_NULL (Transact-SQL).

Если результат объединения строк превышает предел в 8 000 байт, то он усекается. Однако усечения не произойдет, если хотя бы одна из сцепляемых строк принадлежит к типу больших значений.

Примеры

А. Использование объединения строк

В следующем примере создается единственный столбец с заголовком Name из нескольких символьных столбцов, где за фамилией лица следуют запятая, один пробел и имя того же лица. Результирующий набор сортируется в алфавитном порядке по возрастанию, сначала по фамилии, а затем по имени.

USE AdventureWorks2008R2;
GO
SELECT (LastName + ', ' + FirstName) AS Name
FROM Person.Person
ORDER BY LastName ASC, FirstName ASC;

Б. Объединение числовых типов данных и дат

Следующий пример использует функцию CONVERT для объединения типов данных numeric и date.

USE AdventureWorks2008R2;
GO
SELECT 'The order is due on ' + CONVERT(varchar(12), DueDate, 101)
FROM Sales.SalesOrderHeader
WHERE SalesOrderID = 50001;
GO

Ниже приводится результирующий набор.

------------------------------------------------

Дата выполнения заказа: 23.04.2007 г.

(Обработано строк: 1)

В. Использование объединения нескольких строк

Следующий пример сцепляет несколько строк в одну длинную строку для отображения фамилии и первой буквы инициалов вице-президентов в Adventure Works Cycles. После фамилии ставится запятая, а после первой буквы инициалов — точка.

USE AdventureWorks2008R2;
GO
SELECT (LastName + ',' + SPACE(1) + SUBSTRING(FirstName, 1, 1) + '.') AS Name, e.JobTitle
FROM Person.Person AS p
    JOIN HumanResources.Employee AS e
    ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle LIKE 'Vice%'
ORDER BY LastName ASC;
GO

Ниже приводится результирующий набор.

Name Title

-------------      ---------------

Duffy, T.          Vice President of Engineering

Hamilton, J.       Vice President of Production

Welcker, B.        Vice President of Sales

(Обработано строк: 3)