使用 Transact-SQL 拆分字符串的简单有效方法






4.90/5 (26投票s)
本文将演示如何使用 Transact-SQL 分割字符串。
引言
在本文中,我将演示如何使用 Transact-SQL 分割一个 string
。
背景
String
操作对于大多数软件开发人员来说都非常有趣。 使用用户定义的定界符分割 string
对于程序员来说并不新鲜。 即使 Microsoft .NET Framework 也为我们提供了大量的“标准技术”来执行此操作。 但是,如果我们要使用 Transact-SQL 分割一个 string
,那么我们该如何实现呢?
Using the Code
这很容易使用。 我们只需要以下一些基本概念
CHARINDEX
SUBSTRING
CHARINDEX
返回字符 string
中指定表达式的起始位置。
语法
CHARINDEX ( expression1 , expression2 [ , start_location ] )
参数
expression1
:包含要查找的字符序列的表达式。 expression1
是短字符数据类型类别的表达式。
expression2
:一个表达式,通常是一个用于搜索指定序列的列。 expression2
是字符 string
数据类型类别。
start_location
:开始在 expression2
中搜索 expression1
的字符位置。 如果未给出 start_location
,则为负数或零,搜索从 expression2
的开头开始。
返回类型: int
示例
USE pubs
GO
SELECT CHARINDEX('wonderful', notes)
FROM titles
WHERE title_id = 'TC3218'
GO
更多详细信息可以在 此链接 中找到。
SUBSTRING
返回字符、二进制、文本或图像表达式的一部分,以获取有关可与此函数一起使用的有效 Microsoft® SQL Server™ 数据类型的更多信息。
语法
SUBSTRING ( expression , start , length )
参数
Expression
:一个字符 string
、二进制 string
、文本、图像、列或包含列的表达式。 不要使用包含聚合函数的表达式。
Start
:一个整数,用于指定 SUBSTRING
的起始位置。
Length
:一个整数,用于指定 SUBSTRING
的长度(要返回的字符数或字节数)。
注意: 由于在文本数据上使用 SUBSTRING
时,start
和 length
指定字节数,因此 DBCS 数据(例如日语汉字)可能会导致结果的开头或结尾处出现拆分字符。 此行为与 READTEXT
处理 DBCS 的方式一致。 但是,由于偶尔会出现奇怪的结果,因此建议使用 ntext
而不是 text
作为 DBCS 字符。
返回类型:如果 expression 是支持的字符数据类型之一,则返回字符数据。 如果 expression 是支持的二进制数据类型之一,则返回二进制数据。
示例
USE pubs
SELECT au_lname, SUBSTRING(au_fname, 1, 1)
FROM authors
ORDER BY au_lname
更多详细信息可以在 此链接 中找到。
我编写了一个名为 SPLITE
的简单函数,该函数将使用 CHARINDEX
和 SUBSTRING
函数来分割表达式。 下面给出一个示例代码
示例
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Md. Marufuzzaman
-- Create date:
-- Description: Split an expression.
-- Note: If you are using SQL Server 2000, You need to change the
-- length (MAX) to your maximum expression length of each datatype.
-- =============================================
/*
SELECT * FROM [dbo].[SPLIT] (';','I love codeProject;!!!;Your development resources')
*/
CREATE FUNCTION [dbo].[SPLIT]
( @DELIMITER VARCHAR(5),
@LIST VARCHAR(MAX)
)
RETURNS @TABLEOFVALUES TABLE
( ROWID SMALLINT IDENTITY(1,1),
[VALUE] VARCHAR(MAX)
)
AS
BEGIN
DECLARE @LENSTRING INT
WHILE LEN( @LIST ) > 0
BEGIN
SELECT @LENSTRING =
(CASE CHARINDEX( @DELIMITER, @LIST )
WHEN 0 THEN LEN( @LIST )
ELSE ( CHARINDEX( @DELIMITER, @LIST ) -1 )
END
)
INSERT INTO @TABLEOFVALUES
SELECT SUBSTRING( @LIST, 1, @LENSTRING )
SELECT @LIST =
(CASE ( LEN( @LIST ) - @LENSTRING )
WHEN 0 THEN ''
ELSE RIGHT( @LIST, LEN( @LIST ) - @LENSTRING - 1 )
END
)
END
RETURN
END
注意: 我使用了一些其他的函数,如 LNE()
、LEFT()
等,这些函数非常常见,我希望每个人都非常熟悉。 因此,我没有包含它们。 实际上,我不想失去对本文主要目标的关注。
结论
我希望本文对您有所帮助。 祝您愉快!
历史
-
2009 年 8 月 9 日:初始发布