日志含义在带有in关键字的SQL查询中将参数值从String转换为Int64失败

本文关键字:参数 String 转换 失败 Int64 查询 in SQL 关键字 日志 | 更新日期: 2023-09-27 18:14:42

我有以下表结构:

  **Table_A**
        A_Id(BigInt)    Category_Ids(varchar(50))
        1                        1,2,3
        2                         2,3
    **Table_B**
        B_Id(BigInt)    C_Id(Bigint)    Name(varchar(50))
        1                         2              A
        2                         1              C
        3                         3              B

第一个查询:在此查询中,想要获得A_Id=1的记录。我已经执行了以下代码。Select [Category_Ids] from Table_A where A_Id=1这将返回值为"1,2,3"的单列和单行数据表。假设上面的查询将数据填充到A_datatable中。我从下面的代码得到字符串。String id = A_datatable.column[0][" Category_Ids "];

第二个查询:现在,我必须从Table_B中获取C_Id在(1,2,3)中的值。我已经执行了以下代码并将字符串值传递给以下查询。Select * from Table_B where C_Id in (ids)当我执行上述查询得到错误时,未能将参数值从String转换为Int64.

日志含义在带有in关键字的SQL查询中将参数值从String转换为Int64失败

您实际上可以在单个查询中完成。

SELECT  b.*
FROM    Table_A a
        INNER JOIN Table_B b
            ON ',' + a.Category_IDs + ',' LIKE '%,' + CAST(C_ID AS VARCHAR(10)) + ',%'
WHERE   a.A_ID = 1

警告:这个查询是索引杀手。您应该正确地规范化您的表。

更新1

建议模式设计,

Table_A

  • A_ID
  • Category_ID添加

Table_C

  • B_ID
  • C_ID
  • <
  • 名称/gh>

Table_A

A_ID    Category_ID
1       1
1       2
1       3
2       4
2       5

Table_B

B_Id    C_Id    Name
1       2       A
2       1       C
3       3       B

您可以使用下面描述的字符串分割函数http://www.sqlservercentral.com/articles/Tally+Table/72993/

向下滚动到'CREATE FUNCTION'脚本并运行它来创建您的函数,然后您可以将逗号分隔的字符串用于'where in'子句

select * from Table_B
where C_Id in (select item from dbo.DelimitedSplit8K(IDS,','))