TSQL拆分逗号分隔字符串

时间:2012-10-18 15:11:37

标签: tsql list stored-procedures

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

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

因此,我希望得到所有包含这些内容的记录。我最初在LINQ中编写了这个,但由于无法查询列表和数据集,因此无法正常工作。数据集太大(130万条记录)要放入列表中,所以我必须使用一个可能更好的存储过程。

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

请注意,这将是一个访问受限的内部网站,因此担心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个参数完成?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-1)

这是我设置的表值函数:

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   
        )
)