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


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

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

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

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

Syntax

expression + expression

Arguments

expression

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

Return types

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

Remarks

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

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

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

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

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

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

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

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

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

В этом примере нет или 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;

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

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

Examples

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

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

В следующем примере создается один столбец под заголовком 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 + @z + @yто есть => (@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)

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

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

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

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