SUBSTRING (Transact-SQL)
返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分。有关可与该函数一起使用的有效 SQL Server 2005 数据类型的详细信息,请参阅数据类型 (Transact-SQL)。
语法
SUBSTRING ( expression ,start , length )
参数
expression
是字符串、二进制字符串、文本、图像、列或包含列的表达式。不要使用包含聚合函数的表达式。
start
指定子字符串开始位置的整数。start 可以为 bigint 类型。
length
一个正整数,指定要返回的 expression 的字符数或字节数。如果 length为负,则会返回错误。length可以是 bigint 类型。
注意: |
---|
因为 start 和 length 指定了字节数,所以对具有 DBCS 排序规则的 text 数据类型(如日本汉字)使用 SUBSTRING 时,可能会在结果的开始或结束位置导致字符拆分。此行为与 READTEXT 处理 DBCS 的方式一致。因此,我们建议您针对 DBCS 字符使用 ntext 而不是 text。我们建议的另一种备用方法是使用 varchar(max) 数据类型,因为它不会拆分 DBCS 排序规则的字符。 |
返回类型
如果 expression 是受支持的字符数据类型,则返回字符数据。如果 expression 是受支持的 binary 数据类型,则返回二进制数据。
返回的字符串类型与指定表达式的类型相同(表中显示的除外)。
指定的表达式 | 返回类型 |
---|---|
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)
以下示例说明 SUBSTRING 对 text 和 ntext 数据的影响。首先,该示例在 pubs
数据库内创建一个名为 npub_info
的新表。接着,该示例使用 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