2012-10-18 333 views
1

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

第三个箱子的原因是我得到了基本设置后,我们将不会包含,开始于,结束于和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个参数呢?

+0

[T-SQL存储过程接受多个ID值(可能重复http://stackoverflow.com/questions/43249/t- sql-stored-procedure-that-acceptions-multiple-id-values) –

+0

我看了一下,并尝试使用动态SQL,但问题是我不知道如何将值与引号或如果你可以使用它用逗号分隔参数。你也使用IN还是有另一个功能? – korrowan

+0

您不想使用这样的动态SQL,因为它非常容易受到SQL注入攻击。 – RBarryYoung

回答

3

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

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