c# - 如何根据作为 varchar 传递的 ids 列表获得结果?

标签 c# sql sql-server sql-server-2008

我将 ids 列表作为 varchar(500) 传递,并基于需要 ids 记录。我的 sql 代码是

declare @Ids varchar(500) = '12964,12965,12966'

select *
from tblBooks
where BookID in (@Ids)

其中 BookID 是 varchar(50)。Id 的数量可以是 100。将 @Id 转换为 int 会出现以下错误

Conversion failed when converting the varchar value '12964,12965,12966' to data type int

我如何找到结果,因为 @Id 未转换为 Int。

最佳答案

使用表变量:

DECLARE @Ids TABLE (ID INT);
INSERT @Ids VALUES (12964),(12965),(12966);

SELECT *
FROM tblBooks
WHERE BookID in (SELECT ID FROM @Ids);

如果您需要将其传递给过程,则可以使用表值参数:

CREATE TYPE dbo.ListOfInt AS TABLE (ID INT);
GO
CREATE PROCEDURE dbo.GetBooks @IDs dbo.ListOfInt READONLY
AS
BEGIN
    SELECT *
    FROM tblBooks
    WHERE BookID in (SELECT ID FROM @Ids);
END
GO

DECLARE @IDs dbo.ListofInt;
INSERT @Ids VALUES (12964),(12965),(12966);
EXECUTE dbo.GetBooks @Ids;

或者来自 c#

var table = new DataTable();
table.Columns.Add("ID", typeof(int));

// ADD YOUR LIST TO THE TABLE

using (var connection = new SqlConnection("Connection String"))
using (var command = new SqlCommand("dbo.GetBooks", connection))
{
    command.CommandType = CommandType.StoredProcedure;
    var param = new SqlParameter("@Ids", SqlDbType.Structured);
    param.TypeName = "dbo.ListofInt";
    param.Value = table;
    command.Parameters.Add(table);
    connection.Open();

    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // do something
        }
    }
}

一旦 TYPE 到位,您甚至不需要使用存储过程。您可以简单地调用一个普通查询:

using (var connection = new SqlConnection("Connection String"))
using (var command = new SqlCommand("SELECT * FROM tblBooks WHERE BookID IN (SELECT ID FROM @IDs)", connection))
{
    var param = new SqlParameter("@Ids", SqlDbType.Structured);
    param.TypeName = "dbo.ListofInt";
    param.Value = table;
    command.Parameters.Add(table);
    connection.Open();

    // ETC
}

在 c# 中使用 String.Split() 进行拆分并将列表传递给 SQL 比在 SQL 中进行拆分的任何方法都更有效

关于c# - 如何根据作为 varchar 传递的 ids 列表获得结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21434492/

相关文章:

c# - 使用逻辑运算符&& ||过滤列表的方法

sql - 使用 Postgres 的递归/分层查询

sql - 递归 CTE 通过经理获取员工

sql - 如何选择最底部的行?

sql-server - SQL Server 2008 安装

c# - ManagedThreadID 不是唯一的?

c# - 如何检索多个属性的值?

php - SQL : Match IN operator with anything

C# 泛型 : Can I combine overloaded methods into one with different return/input data types?

sql - 内部联接 - 使用相同联接的两个值!