c# - 如何使用动态创建的 IN 集创建存储过程

标签 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

最佳答案

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

在 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://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters

关于c# - 如何使用动态创建的 IN 集创建存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44597671/

相关文章:

c# - 如何将 python 绑定(bind)添加到 C#?

c# - 后台工作人员在午夜时分检查?

mysql - 在 where 中使用引用属性进行 Rails 查询

mysql - MySQL 中何时使用单引号、双引号和反引号

sql-server - 使用强类型数据集重试 SQL Azure 请求

c# - excel 2010 类型冲突 NumberFormat

c# - 在 C# 中将 Guid 传递给命令行解析器库

sql - 约束检查范围 float

sql-server - 如何在sql中使用exec字符串分配变量?

sql - 在右表的非唯一列上左连接两个表