SUBSTRING (Transact-SQL)

返回字符表达式、二进制表达式、文本表达式或图像表达式的一部分。有关可与该函数一起使用的有效 SQL Server 2005 数据类型的详细信息,请参阅数据类型 (Transact-SQL)

主题链接图标Transact-SQL 语法约定

语法

SUBSTRING ( expression ,start , length )

参数

expression

是字符串、二进制字符串、文本、图像、列或包含列的表达式。不要使用包含聚合函数的表达式。

start

指定子字符串开始位置的整数。start 可以为 bigint 类型。

length

一个正整数,指定要返回的 expression 的字符数或字节数。如果 length为负,则会返回错误。length可以是 bigint 类型。

ms187748.note(zh-cn,SQL.90).gif注意:
因为 startlength 指定了字节数,所以对具有 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

备注

必须以字符数指定使用 ntextcharvarchar 数据类型的偏移量(startlength)。必须以字节数指定使用 textimagebinaryvarbinary 等数据类型的偏移量。

ms187748.note(zh-cn,SQL.90).gif注意:
兼容级别可能影响返回值。有关兼容级别的详细信息,请参阅 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

ms187748.note(zh-cn,SQL.90).gif注意:
若要运行以下示例,必须安装 pubs 数据库。有关如何安装 pubs 数据库的信息,请参阅下载 Northwind 和 pubs 示例数据库

以下示例说明如何返回 pubs 数据库的 pub_info 表内每个 textimage 数据列的前 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 对 textntext 数据的影响。首先,该示例在 pubs 数据库内创建一个名为 npub_info 的新表。接着,该示例使用 pub_info.pr_info 列的前 80 个字符在 npub_info 表中创建 pr_info 列,然后将 添加为第一个字符。最后,INNER JOIN 检索所有出版商标识号以及 textntext 出版商信息列的 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

请参阅

参考

字符串函数 (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助