65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (26投票s)

2009年8月9日

CPOL

2分钟阅读

viewsIcon

163422

downloadIcon

435

本文将演示如何使用 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 时,startlength 指定字节数,因此 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 的简单函数,该函数将使用 CHARINDEXSUBSTRING 函数来分割表达式。 下面给出一个示例代码

示例

            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 日:初始发布

© . All rights reserved.