将字符串拆分为行的最有效方法

2024-03-24

我正在使用以下函数将字符串拆分为行。它比我之前使用的函数快得多,但是我需要以某种方式更快地处理这些数据(它是一项 ETL 作业):

ALTER FUNCTION [dbo].[ArrayToTable]
(
     @InputString VARCHAR(MAX) = ''
     , @Delimitter VARCHAR(1) = ',' 
) 
RETURNS @RESULT TABLE([Position] INT IDENTITY, [Value] VARCHAR(MAX)) 
AS 
BEGIN 
    DECLARE @XML XML 
    SELECT @XML = CONVERT(XML, SQL_TEXT) 
    FROM ( 
        SELECT '<root><item>' 
            + REPLACE(@InputString, @Delimitter, '</item><item>') 
            + '</item></root>' AS SQL_TEXT 
        ) dt 

    INSERT INTO @RESULT([Value]) 
    SELECT t.col.query('.').value('.', 'VARCHAR(1000)') AS [Value] 
    FROM @XML.nodes('root/item') t(col) 
    RETURN 
END 

谁能想到一种更好/更快的方法将分隔字符串转换为行?我正在使用一个cross apply根据我的查询加入这些结果。

谁能想到一种更有效的方法将分隔字符串转换为行?


这是我拥有的最高效的功能:

CREATE FUNCTION [Resource].[udf_SplitByXml]
      (@Data NVARCHAR(MAX), @Delimiter NVARCHAR(5))
RETURNS @Table TABLE 
    ( Data NVARCHAR(MAX)
    , SequentialOrder INT IDENTITY(1, 1))
AS
BEGIN

    DECLARE @TextXml XML;
    SELECT @TextXml = CAST('<d>' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@Data, '&', '&amp;'), '<', '&lt;'), '>', '&gt;'), '"', '&quot;'), '''', '&apos;'), @Delimiter, '</d><d>') + '</d>' AS XML);

    INSERT INTO @Table (Data)
    SELECT Data = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(RTRIM(LTRIM(T.split.value('.', 'nvarchar(max)'))), '&amp;', '&'), '&lt;', '<'), '&gt;', '>'), '&quot;', '"'), '&apos;', '''')
    FROM @TextXml.nodes('/d') T(Split)

    RETURN
END

以下是可用于测试结果的示例调用:

SELECT * FROM Resource.udf_SplitByXml('yes, no, maybe, so', ',');
SELECT * FROM Resource.udf_SplitByXml('who|what|where|when|why|how|Uh, I don''t know!', '|');
SELECT * FROM Resource.udf_SplitByXml('Government, Education, Non-profit|Energy & Power|Yes|No', '|');
SELECT * FROM Resource.udf_SplitByXml('Energy & Power|Some<Thing>Wicked''This"Way Comes', '|');

另一种选择是尝试基于 Adam Machanic 代码的 CLR 解决方案,该代码是性能测试的获胜者在这个博客中 http://sqlperformance.com/2012/07/t-sql-queries/split-strings.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串拆分为行的最有效方法 的相关文章

  • 使用 元素通过 Wix 运行 SQL 脚本文件

    我是 Wix 安装程序的新手 我有一个要求 必须提供 SQL Server 登录凭据并从特定路径运行脚本 我不明白出了什么问题 项目已成功构建并创建了 msi 运行后我收到以下错误 错误26204 错误 2147217900 无法执行SQL
  • SSMS 对象资源管理器 - 连接到 Azure DB 时选择丢失的前 N ​​行

    我刚刚将 SSMS 升级到 2008 R2 我缺少从表中选择前 1000 行的选项 如下所示 我的看起来像这样 我知道如何更改显示的行数 但根本不存在这些选项 几年前我看到有人为此提交了一个错误 但没有解决方法 我不知道该怎么办 有任何想法
  • 使用 Android 应用程序将条目发布到 SQL Server

    我是一个真正的新手 如果这个问题听起来很愚蠢 我提前道歉 我正在尝试创建一个应用程序 允许我将客户数据发布到 Windows 服务器上的 SQL Server 这可能吗 如果是这样 我需要什么 再次感谢您的帮助 如果这是一个愚蠢的问题 我再
  • 检查存储过程是否正在运行?

    是否可以检查 SQL Server 中当前是否有任何存储过程正在运行 我问过一次 查看 Sql Server 2000 如何找出当前正在运行哪些存储过程 https stackoverflow com questions 129086 sq
  • 如何将 SQL 参数中的字符串数组传递给 SQL 中的 IN 子句

    我正在以复杂的方式做一个逻辑 我只需要在存储过程中执行此查询 select Sizes SUM Quantity from tbl SizeBreakup where Brand brand and Combo in 1 2 我必须在 C
  • 良好的安全实践和自动身份范围管理是否相互排斥?

    我正在尝试使用自动身份范围管理 http msdn microsoft com en us library ms152543 aspx sectionToggle1 但是 确保我的用户可以在具有标识列的表中插入记录的唯一方法是使它们db o
  • ASP.NET、SQL 2005“分页”

    这是该问题的后续 用于在表单中显示单行的 ASP NET 下一个 上一个按钮 https stackoverflow com questions 1014526 asp net next previous buttons to displa
  • 在 Visual Studio 2010 DBML 设计器 (MS SQL/ASP.NET MVC) 中默认设置 UpdateCheck.Never 模式

    在我的网络应用程序中 我做了很多更新 因此 除主键之外的所有列唯一可接受的 UpdateCheck 模式是 NEVER 但不幸的是 DBML 设计器自动设置 ALWAYS 模式 因此 我必须手动更改数十列 并且当我必须更新 DBML 文件时
  • 连接2个表区分大小写

    我有 2 个表 需要获取品牌代码的结果 例如 在数据库中 我有两个不同的品牌 但它们的代码是相同的 只有小写和大写不同 例如 代码名称 关于耐克 和阿迪达斯 如何在代码上内连接 2 个表以分别获取这 2 个表 现在 在内连接之后我得到了这
  • 如何从 C# 连接到 SQL 数据库?

    我正在尝试为我的家庭网络编写一个本地程序管理和安装系统 并且我认为我已经确定了技术 C NET WPF 客户端 Lua 用于安装脚本支持 通过 LuaInterface SQL Server Express 用于维护程序数据库 但是我不确定
  • SQL Server 中 SYSDATETIME 数据类型的准确性

    我已经在 SQL Server 2008 的存储过程中使用 SYSDATETIME 进行了一些测试 我设置了一个包含带有 IDENTITY 字段的 datetime2 7 的表 我了解这种数据类型的精度和准确度之间的差异 但是 在从此示例中
  • 如何按月(“年”和“月”)对表进行分区并自动创建每月分区?

    我正在尝试按两者对表进行分区Year and Month 我将通过其进行分区的列是具有 ISO 格式 20150110 20150202 等 的日期时间类型列 例如 我有 2010 年 2011 年 2012 年的销售数据 我希望数据按年份
  • DATEADD(day, -7, GETDATE()) - 是否考虑了时间?

    我正在通过 Amazon Redshift 在 Aginity 中编写 SQL 查询来提取过去 7 天的数据 这Date我调用的列是变量类型 DATE 输出示例如下 5 30 2017 0 00 当我调用下面的函数时 运行此查询在一天中的什
  • 如何将 OLE 自动化日期值转换为 SQL Server 中的日期

    我的应用程序存储日期作为 OLE 自动化与DateTime ToOADate 命令 我需要创建一个 SQL 视图来显示存储的日期 如何快速将双精度数转换为日期 Does SELECT CAST CASE WHEN OLEFLOAT gt 0
  • MS-sql 检索年龄最大的学生的成绩数据

    在此输入图像描述 https i stack imgur com mJ8aT png 在此输入图像描述 https i stack imgur com guYsU png 在此输入图像描述 https i stack imgur com 7
  • 如何用NULL替换空格

    我在 sql server 2012 中有一个包含空格的列 我想用 NULL 替换这些空白 我已经编写了以下查询 但它不起作用 SELECT replace COLUMN1 NULL FROM Orders 如何实现上述功能 提前致谢 Us
  • SqlCommand返回值参数

    也许查看此代码的其他人能够告诉我为什么 returnID 始终为 0 我正在尝试从插入的记录中检索新的 ID public int AddToInventory int PartID int QtyOnHand int SpokenFor
  • MySQL CREATE TABLE 语句上的外键错误(错误:150)

    我觉得我已经在一对非常简单的创建表语句上尝试了一切可能的方法 类型匹配 我尝试使用 ENGINE InnoDB 等 但很困惑为什么我收到外键错误 我已经离开 SQL 一段时间了 所以这可能是一个简单的问题 mysql gt CREATE T
  • 为列名创建动态选择获取值 - 在 SQL Server 中

    请帮助我创建一个选择 SQL 语句 其中的结果列名称是从原始表中的列值获取的 表名是Device Part 用户可以输入很多DeviceCode其中有许多动态PartTypeName PartTypeName 值为PartInfo 这可能有
  • 如何返回以列名作为第一行的 T-SQL 查询

    我正在编写一个 SSIS 包来将数据从 SQL Server 2012 数据库输出到 CSV为客户归档 要求是第一行是列名称 下面是我为数据流任务中的源编写的查询 问题是 它总是将列名返回为最后一行 而不是第一行 为什么 我该如何实现这一目

随机推荐