SUBSTRING (Transact-SQL)
傳回字元、二進位、文字或影像運算式的一部份。如需有關這個函數所能使用之有效 SQL Server 2005 資料類型的詳細資訊,請參閱<資料類型 (Transact-SQL)>。
語法
SUBSTRING ( expression ,start , length )
引數
expression
這是包括資料行的字元字串、二進位字串、文字、影像、資料行或運算式。請勿使用包括彙總函數的運算式。
start
這是指定子字串起始位置的整數。start 的類型可以是 bigint。
length
這是一個正整數,指定將傳回的 expression 字元或位元組數目。如果 length 是負數,則會傳回錯誤。length 的類型可以是 bigint。
![]() |
---|
由於 start 和 length 會指定位元組數目,當在 text 資料類型上,搭配 DBCS 定序 (如漢字) 來使用 SUBSTRING 時,可能會在結果的開頭或結尾分割字元。這個行為與 READTEXT 處理 DBCS 的方式一致。因此,我們建議您利用 ntext 來取代 DBCS 字元的 text。我們建議的另一個替代方式是使用 varchar(max) 資料類型,因為它不會分割 DBCS 定序的字元。 |
傳回類型
如果 expression 是支援的字元資料類型之一,就會傳回字元資料。如果 expression 是支援的二進位資料類型之一,就會傳回二進位資料。
傳回的字串與指定運算式的類型相同,但下表所顯示者例外。
指定的運算式 | 傳回類型 |
---|---|
char/varchar/text |
varchar |
nchar/nvarchar/ntext |
nvarchar |
binary/varbinary/image |
varbinary |
備註
使用 ntext、char 或 varchar 資料類型的位移 (start 和 length),必須用字元數目來指定。使用 text、image、binary 或 varbinary 資料類型的位移,必須用位元組數目來指定。
![]() |
---|
相容性層級可能會影響傳回值。如需有關相容性層級的詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。 |
範例
A. 搭配字元字串使用 SUBSTRING
下列範例會顯示如何只傳回字元字串的一部份。這個查詢會從 Contact
資料表中,傳回第一個資料行中的姓氏,而第二資料行只有第一個首字母。
USE AdventureWorks;
GO
SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial
FROM Person.Contact
WHERE LastName like 'Barl%'
ORDER BY LastName
以下為結果集:
LastName Initial
--------------------------------- -------
Barley R
Barlow B
(2 row(s) affected)
以下是如何顯示字串常數 abcdef
的第二、第三和第四個字元。
SELECT x = SUBSTRING('abcdef', 2, 3)
以下為結果集:
x
----------
bcd
(1 row(s) affected)
B. 搭配 text、ntext 和 image 資料使用 SUBSTRING
![]() |
---|
若要執行下列範例,您必須安裝 pubs 資料庫。如需有關如何安裝 pubs 資料庫的資訊,請參閱<下載 Northwind 和 pubs 範例資料庫>。 |
下列範例會顯示如何從 pubs
資料庫 pub_info
資料表的各個 text 和 image 資料行中,傳回前 200 個字元。text 資料會以 varchar 傳回,image 資料會以 varbinary 傳回。
USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,
SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756'
以下為結果集:
pub_id logo pr_info
------ ---------------------- ----------
1756 0x474946383961E3002500 This is sa
(1 row(s) affected)
下列範例會顯示 text 和 ntext 資料的 SUBSTRING 效果。首先,這個範例會在名稱為 npub_info
的 pubs
資料庫中,建立一份新的資料表。其次,這個範例會從 pub_info.pr_info
資料行的前 80 個字元中,建立 npub_info
資料表的 pr_info
資料行,再加入 ü
來作為第一個字元。最後,INNER JOIN
會擷取所有發行者識別碼,以及 text 和 ntext 發行者資訊資料行的 SUBSTRING
。
IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'npub_info')
DROP TABLE npub_info
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs
GO
CREATE TABLE npub_info
(
pub_id char(4) NOT NULL
REFERENCES publishers(pub_id)
CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
pr_info ntext NULL
)
GO
-- Fill the pr_info column in npub_info with international data.
RAISERROR('Now at the inserts to pub_info...',0,1)
GO
INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database')
INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
INSERT npub_info values('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC