SQL 参数数据类型 int 对 charindex 函数的参数 1 无效

Posted

技术标签:

【中文标题】SQL 参数数据类型 int 对 charindex 函数的参数 1 无效【英文标题】:SQL Argument data type int is invalid for argument 1 of charindex function 【发布时间】:2016-07-29 06:18:54 【问题描述】:

我正在尝试将 mysql 查询转换为 MsSql 查询,但我遇到了问题。这是我的查询:

MySQL

SELECT *,
(SELECT count(books.id)
   FROM books
   WHERE books.status = 1
     AND FIND_IN_SET(categories.id, books.multiple_category_id)) AS book_count
   FROM categories, books
   WHERE categories.parent_id=0
     AND categories.status=1 ;

我试过的 SQL

SELECT *,
  (SELECT count(books.id)
   FROM books
   WHERE books.status = 1
     AND CHARINDEX(categories.id, books.multiple_category_id) > 0) AS book_count
   FROM categories, books
   WHERE categories.parent_id=0
     AND categories.status=1 ;

我得到的错误是:

Argument data type int is invalid for argument 1 of charindex function.

供参考。 http://sqlfiddle.com/#!3/4ed19/3

有人有什么想法吗? 提前致谢!

【问题讨论】:

【参考方案1】:

使用此查询。我刚刚将categories.id 更改为CAST(categories.id AS VARCHAR)。因为idcategories 表中是integer

SELECT *,
(SELECT count(books.id)
   FROM books
   WHERE books.status = 1
     AND CHARINDEX(CAST(categories.id AS VARCHAR), books.multiple_category_id) > 0) AS book_count
FROM categories,
     books
WHERE categories.parent_id=0
  AND categories.status=1 ;

【讨论】:

感谢您抽出宝贵的时间来回答这个问题.. 荣誉 有什么理由拒绝投票?【参考方案2】:

MS-SQL 的CHARINDEX 函数需要 VARCHAR 或 NVARCHAR 作为参数,因此您的 categories.id 应转换为 VARCHAR。像这样的:

CHARINDEX(CAST(categories.id AS VARCHAR(16)), books.multiple_category_id ) > 0 )

但是,我会考虑重构表和您的查询:

1.查询重构

正如它所写的,你可以有错误的匹配。例如。 categories.id = 1 而你的 multiple_category_id'11,12'。 split your string 的替代方法是让您的条件如下:

AND EXISTS (SELECT 1 FROM dbo.SplitString(books.multiple_category_id) WHERE Token = categories.id)

此外,* 应该替换为实际需要的列(在这种情况下,它将带来两个表中的所有列)。像这样的:

2。表重构

您应该像这样定义一个 X 表,而不是解析字符串:

categoryXbook

categoryId FK 参考类别 bookId FK 参考书 主键(categoryId、bookId)

因此,您可以使用简单的JOINs 进行查询,而不是使用速度较慢的字符串搜索(不能使用索引)。

【讨论】:

【参考方案3】:

这是另一种方法

SELECT *,
       (SELECT Count(books.id)
        FROM   books
        WHERE  books.status = 1
               AND ',' + books.multiple_category_id + ',' LIKE '%,' + cast(categories.id as varchar(50))+ ',%') AS book_count
FROM   categories,
       books
WHERE  categories.parent_id = 0
       AND categories.status = 1; 

注意:在您的查询中,categoriesbooks 表之间存在笛卡尔积。我猜你在From 子句中不需要books。停止在违反第一范式的列中存储逗号分隔值

【讨论】:

将 varchar 值 '%,' 转换为数据类型 int 时转换失败。 @Chinnu - 现在更新检查

以上是关于SQL 参数数据类型 int 对 charindex 函数的参数 1 无效的主要内容,如果未能解决你的问题,请参考以下文章

SQL:使用in作查询的时候查询参数的类型还可以不一样呢?

oracle 中有没有int、integer的数字数据类型

将int作为sql参数

sql server存储过程的参数都有哪些类型

sql语句对int类型进行模糊查询

SQL Server 存储过程参数 - 不同类型