Sdílet prostřednictvím


|| (Zřetězení řetězců) (Transact-SQL)

platí pro:databáze Azure SQL DatabaseAzure SQL Managed InstanceSQL v Microsoft Fabric

Operátor || kanálů ve výrazu řetězce zřetězí dva nebo více znaků nebo binárních řetězců, sloupců nebo kombinace řetězců a názvů sloupců do jednoho výrazu (řetězcový operátor). Například SELECT 'SQL ' || 'Server'; vrátí SQL Server. Operátor || se řídí standardem ANSI SQL pro zřetězení řetězců. Na SQL Serveru můžete také provést zřetězení řetězců pomocí operátoru + a funkce CONCAT().

Transact-SQL konvence syntaxe

Syntax

expression || expression

Argumenty

výrazu

Libovolný platný výraz libovolného z datových typů v kategorii znaku a binárního datového typu, s výjimkouxml , json, obrázku, ntextnebo textových datových typů. Oba výrazy musí být stejného datového typu nebo jeden výraz musí být schopen implicitně převést na datový typ druhého výrazu.

Návratové typy

Vrátí datový typ argumentu s nejvyšší prioritou. Další informace naleznete v tématu Priorita datového typu.

Poznámky

Mezi výhody použití syntaxe zřetězení řetězců ANSI patří:

  • Přenositelnost: Použití standardního operátoru || ANSI pro zřetězení řetězců zajišťuje přenos kódu SQL napříč různými databázovými systémy. To znamená, že můžete beze změny spouštět stejné dotazy SQL na různých databázových platformách.

  • Konzistence: Dodržování standardu ANSI podporuje konzistenci v kódu SQL, což usnadňuje čtení a údržbu, zejména při práci v prostředích s více databázovými systémy.

  • Interoperabilita: Standard ANSI je široce rozpoznán a podporován většinou databázových systémů kompatibilních s SQL, což zvyšuje interoperabilitu mezi různými systémy a nástroji.

Chování zkrácení řetězce

Pokud výsledek zřetězení řetězců překročí limit 8 000 bajtů, výsledek se zkrátí. Pokud je ale alespoň jeden z řetězců zřetězený velký typ hodnoty, nedojde ke zkrácení.

Řetězce a znaky nulové délky

Operátor || (zřetězení řetězců) se chová odlišně, když pracuje s prázdným řetězcem nulové délky, než když pracuje s NULLnebo neznámými hodnotami. Řetězec znaku nulové délky lze zadat jako dvě jednoduché uvozovky bez jakýchkoli znaků uvnitř uvozovek. Binární řetězec nulové délky lze zadat jako 0x bez jakýchkoli hodnot bajtů zadaných v šestnáctkové konstantě. Zřetězení řetězce nulové délky vždy zřetězí dva zadané řetězce.

Zřetězení hodnot NULL

Stejně jako u aritmetických operací, které se provádějí s NULL hodnotami, při přidání NULL hodnoty ke známé hodnotě je výsledkem obvykle NULL hodnota. Operace zřetězení řetězců provedená s hodnotou NULL by měla také vytvořit NULL výsledek.

Operátor || neresektuje možnost SET CONCAT_NULL_YIELDS_NULL a vždy se chová, jako by bylo povolené chování ANSI SQL, a poskytuje NULL, pokud je některý ze vstupů NULL. Toto je hlavní rozdíl v chování mezi operátory + a || zřetězení. Další informace naleznete v tématu SET CONCAT_NULL_YIELDS_NULL.

Použití funkce CAST a CONVERT v případě potřeby

Explicitní převod na data znaků se musí použít při zřetězení binárních řetězců a všech znaků mezi binárními řetězci.

Následující příklady ukazují, kdy CONVERTnebo CASTje nutné použít s binární zřetězením a při CONVERTnebo CASTnení nutné použít.

V tomto příkladu není vyžadována žádná CONVERT ani CAST funkce, protože tento příklad zřetězí dva binární řetězce.

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

V tomto příkladu se vyžaduje CONVERT nebo CAST funkce, protože tento příklad zřetězí dva binární řetězce a mezeru.

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

Příklady

Ukázky kódu Transact-SQL v tomto článku používají AdventureWorks2022 nebo AdventureWorksDW2022 ukázkovou databázi, kterou si můžete stáhnout z domovské stránky ukázky Microsoft SQL Serveru a projekty komunity.

A. Použití zřetězení řetězců

Následující příklad vytvoří jeden sloupec pod záhlavím sloupce Name z více sloupců znaků, se jménem rodiny (LastName) osoby následovanou čárkou, jednou mezerou a potom křestním jménem (FirstName) osoby. Sada výsledků je ve vzestupném, abecedním pořadí podle jména rodiny a potom podle jména.

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

B. Kombinování číselných a datových typů kalendářních dat

Následující příklad používá funkci CONVERT ke zřetězení číselných a datových typů kalendářních dat.

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

Tady je sada výsledků.

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

C. Použití více zřetězení řetězců

Následující příklad zřetězí více řetězců, aby se vytvořil jeden dlouhý řetězec, aby se zobrazilo jméno rodiny a první iniciála viceprezidentů v Adventure Works Cycles. Za jméno rodiny se přidá čárka a tečka za prvním iniciálem.

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

Tady je sada výsledků.

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

D. Použití velkých řetězců v zřetězení

Následující příklad zřetězí více řetězců, aby vytvořil jeden dlouhý řetězec, a pak se pokusí vypočítat délku konečného řetězce. Konečná délka sady výsledků je 16 000, protože vyhodnocení výrazu začíná zleva, tj. @x + @z + @y => (@x + @z) + @y. V tomto případě se výsledek (@x + @z) zkrátí na 8 000 bajtů a pak se @y přidá do sady výsledků, což zkrátí konečnou délku řetězce 16 000. Vzhledem k tomu, že @y je řetězec typu velká hodnota, nedojde ke zkrácení.

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

Tady je sada výsledků.

y
-------
16000