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

Mic*_*kel 2 c# sql sql-server sql-server-2008

我将ids列表作为varchar(500)传递并基于该ID记录是必需的.我的sql代码是

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

select *
from tblBooks
where BookID in (@Ids)
Run Code Online (Sandbox Code Playgroud)

其中BookID是varchar(50).Ids的数量可以是100.将@Ids转换为int会产生以下错误

将varchar值'12964,12965,12966'转换为数据类型int时转换失败

如何找到结果@Id不会转换为Int.

Gar*_*thD 7

使用表变量:

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

SELECT *
FROM tblBooks
WHERE BookID in (SELECT ID FROM @Ids);
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

或者来自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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦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
}
Run Code Online (Sandbox Code Playgroud)

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