【问题标题】:TSQL split comma delimited stringTSQL 拆分逗号分隔字符串
【发布时间】:2012-10-18 15:11:37
【问题描述】:

我正在尝试创建一个存储过程,该过程将拆分网页上的 3 个文本框,这些文本框具有用户输入,其中都有逗号分隔的字符串。我们的表中有一个名为“combined_name”的字段,我们必须搜索名字和姓氏以及任何已知的错误或昵称等,例如 @p1: 'grei,grie' @p2: 'joh,jon,j.. ' p3: 是空的。

第三个框的原因是在我设置了基础知识之后,我们将不包含、开头、结尾和 IS 以进一步缩小我们的结果。

因此,我希望获取包含这些任意组合的所有记录。我最初是在 LINQ 中编写的,但它不起作用,因为您无法查询列表和数据集。数据集太大(130 万条记录)无法放入列表中,因此我必须使用存储过程,无论如何这可能会更好。

我是否必须使用 2 个 SP,一个用于拆分每个字段,一个用于选择查询,还是可以用一个来完成?我在 tsql 中使用什么函数来包含?我尝试使用 IN win a 查询,但无法弄清楚它如何处理多个参数。

请注意,这将是一个访问受限的内部站点,因此不必优先考虑 sql 注入。

我确实尝试了动态 SQL,但没有得到正确的结果:

    CREATE PROCEDURE uspJudgments @fullName nvarchar(100) AS
   EXEC('SELECT *
         FROM   new_judgment_system.dbo.defendants_ALL 
         WHERE  combined_name IN (' + @fullName + ')')
GO

EXEC uspJudgments @fullName = '''grein'', ''grien'''

即使这确实检索到正确的结果,如何使用 3 个参数来完成?

【问题讨论】:

  • 我看了一下并尝试使用动态 SQL,但问题是我不确定如何使用引号传递值,或者是否可以将它与多个逗号分隔参数一起使用。你也用IN还是有别的功能?
  • 你不想像那样使用动态 SQL,因为它很容易受到 SQL 注入攻击。
  • SQL 注入不会成为问题。这是一个内部应用程序,4 人也可以访问。
  • 无论如何,在这种情况下不需要动态 SQL。我在链接上的回答显示了如何以 T-SQL 中已知的最快方式实现其他技术之一(字符串拆分)。

标签: tsql list stored-procedures


【解决方案1】:

您可以尝试使用this 来拆分字符串并获取字符串表。然后要拥有所有组合,您可以使用这两个表的完全连接。然后进行选择。

【讨论】:

    【解决方案2】:

    这是我设置的表值函数:

    ALTER FUNCTION [dbo].[Split] (@sep char(1), @s varchar(8000)) 
    RETURNS table
    AS
    RETURN (     
        WITH splitter_cte AS (       
            SELECT CHARINDEX(@sep, @s) as pos, 0 as lastPos       
            UNION ALL      
            SELECT CHARINDEX(@sep, @s, pos + 1), pos       
            FROM splitter_cte       
            WHERE pos > 0     
        )     
        SELECT SUBSTRING(@s, lastPos + 1,                      
            case when pos = 0 then 80000                      
            else pos - lastPos -1 end) as OutputValues     
            FROM splitter_cte   
            )
    )
    

    【讨论】:

      猜你喜欢
      • 2018-12-21
      • 2015-03-07
      • 2017-01-05
      • 2012-05-24
      • 2023-04-09
      • 2014-01-03
      相关资源
      最近更新 更多