||(字串串連)(Transact-SQL)
適用於:Microsoft Fabric 中的 Azure SQL 資料庫 SQL 資料庫
||
字串表示式中的管道運算符會串連兩個或多個字元或二進位字串、數據行,或字串和數據行名稱的組合成一個表達式(字元串運算符)。 例如 SELECT 'SQL ' || 'Server';
會傳回 SQL Server
。
語法
expression || expression
引數
expression
字元和二進位數據類型類別目錄中任何一個數據類型的任何有效運算式,但 xml、json、image、ntext 或 text 數據類型除外。 兩個運算式的資料類型必須相同,或者其中一個運算式必須可以用隱含方式轉換為另一個運算式的資料類型。
傳回類型
傳回優先順序最高之引數的資料類型。 如需詳細資訊,請參閱 數據類型優先順序。
備註
如果字串的串連結果超出 8,000 位元組的限制,就會截斷結果。 不過,如果至少有一個串連的字串是大型實值型別,則不會發生截斷。
長度為零的字串和字元
||
當運算子使用空的、長度為零的字串時,其行為方式會與使用NULL
、 或未知值時不同。 長度為零的字元字串可以指定為兩個單引號,引號內不含任何字元。 零長度的二進位字串可以指定為 0x
,而不需在十六進位常數中指定的任何位元元組值。 串連長度為零的字串,一律會串連兩個指定的字串。
NULL 值的串連
如同在值上 NULL
執行的算術運算,當值加入至已知值時 NULL
,結果通常是 NULL
值。 使用 NULL
值執行的字串串連作業也應該產生 NULL
結果。
運算子||
不會接受 SET CONCAT_NULL_YIELDS_NULL
選項,而且一律會像啟用 ANSI SQL 行為一樣運作,如果有任何輸入為 NULL
,則NULL
會產生 。 這是與 ||
串連運算符之間+
行為的主要差異。 如需詳細資訊,請參閱 SET CONCAT_NULL_YIELDS_NULL。
必要時使用 CAST 和 CONVERT
當串連二進位字串和二進位字串之間的任何字元時,必須使用指向字元資料的明確轉換。
下列範例顯示 當 CONVERT
、 或 必須搭配二進位串連使用,且 當 、 或CAST
CAST
不需要使用時CONVERT
。
在此範例中,不需要 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
在此範例中,需要 或 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 Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。
A. 使用字串串連
下列範例會從多個字元數據行的數據行標題 Name
下建立單一數據行,其姓氏 (LastName
) 後面接著逗號、單一空格,然後建立人員的名字 (FirstName
) 。 結果集會依姓氏遞增、依字母順序排列,然後依名字排列。
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
) 的結果截斷為 8,000 個字節,然後 @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