Udostępnij za pośrednictwem


|| (Łączenie ciągów) (Transact-SQL)

Dotyczy:usługi Azure SQL DatabaseAzure SQL Managed InstanceSQL Database w usłudze Microsoft Fabric

Operator || potoków w wyrażeniu ciągu łączy dwa lub więcej znaków lub ciągów binarnych, kolumn lub kombinację ciągów i nazw kolumn w jednym wyrażeniu (operator ciągu). Na przykład SELECT 'SQL ' || 'Server'; zwraca SQL Server. Operator || jest zgodny ze standardem ANSI SQL na potrzeby łączenia ciągów. W programie SQL Server można również łączyć ciągi przy użyciu operatora + i funkcji CONCAT().

Transact-SQL konwencje składni

Składnia

expression || expression

Argumenty

wyrażenia

Każde prawidłowe wyrażenie dowolnego z typów danych w kategorii typów danych znaków i binarnych, z wyjątkiemxml , obrazu, ntextlub typów danych tekstowych. Oba wyrażenia muszą być tego samego typu danych lub jedno wyrażenie musi być niejawnie konwertowane na typ danych drugiego wyrażenia.

Typy zwracane

Zwraca typ danych argumentu o najwyższym pierwszeństwie. Aby uzyskać więcej informacji, zobacz Pierwszeństwo typu danych.

Uwagi

Niektóre korzyści wynikające z używania składni łączenia ciągów ANSI obejmują:

  • Przenośność: użycie standardowego operatora || ANSI na potrzeby łączenia ciągów gwarantuje, że kod SQL jest przenośny w różnych systemach baz danych. Oznacza to, że można uruchamiać te same zapytania SQL na różnych platformach baz danych bez modyfikacji.

  • Spójność: Przestrzeganie standardu ANSI promuje spójność w kodzie SQL, co ułatwia odczytywanie i konserwowanie, zwłaszcza podczas pracy w środowiskach z wieloma systemami baz danych.

  • Współdziałanie: standard ANSI jest powszechnie rozpoznawany i obsługiwany przez większość systemów baz danych zgodnych z programem SQL, zwiększając współdziałanie różnych systemów i narzędzi.

Zachowanie obcinania ciągów

Jeśli wynik łączenia ciągów przekracza limit 8000 bajtów, wynik zostanie obcięty. Jeśli jednak co najmniej jeden ze połączonych ciągów jest dużym typem wartości, obcięcie nie występuje.

Ciągi i znaki o zerowej długości

Operator || (łączenie ciągów) działa inaczej, gdy działa z pustym ciągiem o zerowej długości niż w przypadku pracy z wartościami NULLlub nieznanymi. Ciąg znaków o zerowej długości można określić jako dwa pojedyncze znaki cudzysłowu bez żadnych znaków wewnątrz cudzysłowu. Ciąg binarny o zerowej długości można określić jako 0x bez żadnych wartości bajtów określonych w stałej szesnastkowej. Łączenie ciągu o zerowej długości zawsze łączy dwa określone ciągi.

Łączenie wartości NULL

Podobnie jak w przypadku operacji arytmetycznych wykonywanych na wartościach NULL, gdy wartość NULL jest dodawana do znanej wartości, wynik jest zazwyczaj wartością NULL. Operacja łączenia ciągów wykonana z wartością NULL powinna również wygenerować wynik NULL.

Operator || nie uwzględnia opcji SET CONCAT_NULL_YIELDS_NULL i zawsze zachowuje się tak, jakby zachowanie ANSI SQL zostało włączone, co daje NULL, jeśli którykolwiek z danych wejściowych jest NULL. Jest to podstawowa różnica w zachowaniu między operatorami łączenia + i ||. Aby uzyskać więcej informacji, zobacz SET CONCAT_NULL_YIELDS_NULL.

Korzystanie z rzutowania i konwertowania w razie potrzeby

Jawna konwersja na dane znaków musi być używana podczas łączenia ciągów binarnych i wszystkich znaków między ciągami binarnymi.

W poniższych przykładach pokazano, kiedy CONVERT, lub CAST, muszą być używane z łączeniem binarnym, a gdy CONVERTlub CAST, nie trzeba używać.

W tym przykładzie nie jest wymagana żadna funkcja CONVERT ani CAST, ponieważ ten przykład łączy dwa ciągi binarne.

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

W tym przykładzie wymagana jest funkcja CONVERT lub CAST, ponieważ ten przykład łączy dwa ciągi binarne i spację.

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

Przykłady

Przykłady kodu Transact-SQL w tym artykule korzystają z przykładowej bazy danych AdventureWorks2022 lub AdventureWorksDW2022, którą można pobrać ze strony głównej Przykłady programu Microsoft SQL Server i projekty społeczności.

A. Używanie łączenia ciągów

Poniższy przykład tworzy jedną kolumnę pod nagłówkiem kolumny Name z wielu kolumn znaków z nazwą rodziny (LastName) osoby, po której następuje przecinek, pojedyncza spacja, a następnie imię (FirstName) osoby. Zestaw wyników jest w kolejności rosnącej, alfabetycznej według nazwy rodziny, a następnie według imienia.

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

B. Łączenie typów danych liczbowych i dat

W poniższym przykładzie użyto funkcji CONVERT do łączenia liczbowych i typów danych daty.

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

Oto zestaw wyników.

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

C. Używanie wielu łączenia ciągów

Poniższy przykład łączy wiele ciągów w celu utworzenia jednego długiego ciągu w celu wyświetlenia nazwy rodziny i pierwszego inicjała wiceprezesów w Adventure Works Cycles. Przecinek jest dodawany po nazwie rodziny i kropki po pierwszym inicjały.

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

Oto zestaw wyników.

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

D. Używanie dużych ciągów w łączenia

Poniższy przykład łączy wiele ciągów w celu utworzenia jednego długiego ciągu, a następnie próbuje obliczyć długość końcowego ciągu. Końcowa długość zestawu wyników wynosi 16 000, ponieważ ocena wyrażeń zaczyna się od lewej, czyli @x + @z + @y => (@x + @z) + @y. W tym przypadku wynik (@x + @z) jest obcięty na 8000 bajtów, a następnie @y jest dodawany do zestawu wyników, co sprawia, że końcowa długość ciągu wynosi 16 000. Ponieważ @y jest ciągiem typu dużej wartości, obcięcie nie występuje.

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

Oto zestaw wyników.

y
-------
16000