SUBSTRING (Transact-SQL)

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

 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

转载于:https://www.cnblogs.com/tishifu/archive/2007/08/21/863796.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值