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


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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

Оператор в строковом выражении, объединяющий две или более символьных или двоичных строки, два или более столбцов или несколько строк и имен столбцов в одно выражение (строковый оператор). Например, SELECT 'book'+'case'; возвращает bookcase.

Соглашения о синтаксисе Transact-SQL

Синтаксис

expression + expression

Аргументы

выражение

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

Типы возвращаемых данных

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

Замечания

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

Строки и символы нулевой длины

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

Объединение значений NULL

При работе со строками со NULL значением результат объединения зависит от параметров сеанса. Как и при арифметических операциях, выполняемых для NULL значений, при NULL добавлении значения к известному значению результат обычно является неизвестным значением, операция объединения строк, выполняемая со NULL значением, также должна привести к результату NULL .

Однако можно изменить данное поведение, поменяв значение CONCAT_NULL_YIELDS_NULL для текущего сеанса. Дополнительные сведения см. в описании SET CONCAT_NULL_YIELDS_NULL.

Использование CAST и CONVERT при необходимости

При сцеплении двоичных строк с любыми символами между двоичными строками необходимо использовать явное преобразование в символьные данные.

В следующих примерах показано, когда CASTCONVERTнеобходимо использовать двоичное объединение, а также когда CONVERTCASTили , не нужно использовать.

В этом примере нет или CAST функция не CONVERT требуется, так как этот пример объединяет две двоичные строки.

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;

В этом примере требуется или CAST функция, CONVERT так как этот пример объединяет две двоичные строки плюс пробел.

DECLARE @mybin1 VARBINARY(5), @mybin2 VARBINARY(5);

SET @mybin1 = 0xFF;
SET @mybin2 = 0xA5;

-- 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 в этой статье используют AdventureWorks2022 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.

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

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

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

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

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

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

Вот результирующий набор.

------------------------------------------------
The order is due on 04/23/2007

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

В следующем примере объединяются несколько строк для формирования одной длинной строки для отображения имени семьи и первого инициала вице-президентов в Adventure Works Cycles. Запятая добавляется после имени семьи и периода после первого инициала.

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

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

В приведенном ниже примере выполняется объединение нескольких строк в одну длинную строку, а затем предпринимается попытка вычислить длину итоговой строки. Окончательная длина результирующих наборов составляет 16 000, так как оценка выражений начинается слева, @x + @y + @zто есть => (@x + @z) + . @y В этом случае результат (@x + @z) усечен на 8000 байт, а затем @y добавляется в результирующий набор, что делает окончательную длину строки 16 000. Так как @y это строка большого типа значения, усечение не происходит.

DECLARE @x VARCHAR(8000) = REPLICATE('x', 8000)
DECLARE @y VARCHAR(max) = REPLICATE('y', 8000)
DECLARE @z VARCHAR(8000) = REPLICATE('z',8000)
SET @y = @x + @z + @y
-- The result of following select is 16000
SELECT LEN(@y) AS y
GO

Вот результирующий набор.

y
-------
16000

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

Примеры кода Transact-SQL в этой статье используют AdventureWorks2022 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.

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

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

SELECT (LastName + ', ' + SUBSTRING(FirstName, 1, 1) + '.') AS Name, Title
FROM DimEmployee
WHERE Title LIKE '%Vice Pres%'
ORDER BY LastName ASC;

Вот результирующий набор.

Name               Title
-------------      ---------------
Duffy, T.          Vice President of Engineering
Hamilton, J.       Vice President of Production
Welcker, B.        Vice President of Sales