日志含义在带有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.
您实际上可以在单个查询中完成。
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>
记录strong>
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_Bwhere C_Id in (select item from dbo.DelimitedSplit8K(IDS,','))