Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL分割逗号分隔字符串_Tsql_List_Stored Procedures - Fatal编程技术网

TSQL分割逗号分隔字符串

TSQL分割逗号分隔字符串,tsql,list,stored-procedures,Tsql,List,Stored Procedures,我正在尝试创建一个存储过程,该过程将拆分网页上的3个文本框,这些文本框包含用户输入,并且其中都包含逗号分隔的字符串。在我们的表中有一个名为“combined_name”的字段,我们必须搜索名字和姓氏以及任何已知的错误或昵称等。例如@p1:“grei,grie”@p2:“joh,jon,j…”p3:为空 第三个框的原因是,在我设置了基本设置之后,我们将不包含、以开始、以结束,并进一步缩小结果范围 因此,我希望获得所有包含这些组合的记录。我最初是在LINQ中编写的,但它不起作用,因为您无法查询列表和

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

第三个框的原因是,在我设置了基本设置之后,我们将不包含、以开始、以结束,并进一步缩小结果范围

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

我是否必须使用2个SP,一个用于拆分每个字段,另一个用于选择查询,或者可以使用一个SP来完成?我在tsql中使用什么函数来包含内容?我尝试在一个查询中使用win,但无法理解它如何处理多个参数

请注意,这将是一个访问受限的内部站点,因此担心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个参数执行此操作

您可以尝试使用拆分字符串并获取字符串表。然后,为了获得所有的组合,您可以使用这两个表的完全联接。然后进行选择。

以下是我设置的表值函数:

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

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