如何使用动态创建的IN集

时间:2017-06-16 20:41:19

标签: c# sql sql-server stored-procedures sql-server-2012

我有一些SQL,我通过盲目要求/请求转换为存储过程。我正在查看的应用程序中有一些SQL,它使用动态IN(set)语句构建where子句。我已经搜索了动态存储过程,但没有接近我正在寻找的东西。以下是WHERE子句的示例:

WHERE Var.A = @Param AND Var.Id IN

从这里开始,SQL是使用字符串构建器手动构建的,然后执行。不知道我是如何将其转换为存储过程的,因为我对他们来说还不太新。

我们正在使用C#和SQL Server

3 个答案:

答案 0 :(得分:3)

您可以使用用户定义的数据类型。

在C#方面,它看起来像这样:

//Setup a DataTable with the same structure as the SQL Type
var data = new DataTable();
data.Columns.Add("value", typeof(string));

//Populate the table
data.Rows.Add("oneID");
data.Rows.Add("anotherID");

//You create your sql command
cmd.Parameters.Add("@listArgument", data);
//Command execution

在SQL端,你可以有类似这样的类型

CREATE TYPE [dbo].[NVarCharTable] AS TABLE (
    [value] NVARCHAR(MAX) NOT NULL);

然后是存储过程:

CREATE PROCEDURE [dbo].[MyProc] 
    @listArgument NVarCharTable READONLY
AS
BEGIN

    SELECT *
    FROM FOO
    WHERE Var.Id IN (Select [value] FROM @listArgument)

END

参考:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters

答案 1 :(得分:1)

如果您使用的是SQl SERVER 2016或更高版本,您可以使用string_split函数将csv参数转换为表格,然后在IN列表中使用它

e.g。

SELECT * FROM TBL WHERE Var.A = @Param AND Var.Id IN (SELECT value FROM STRING_SPLIT(@inlist, ','))

希望这有帮助

答案 2 :(得分:1)

要退回@lostmylogin,您可以传入一个分隔的参数,并使用其中一个SQL函数将其解析为一个表:

http://sqlservercentral.com/scripts/SUBSTRING/124330 要么 http://sqlservercentral.com/scripts/Miscellaneous/31913