【发布时间】:2016-03-21 03:39:24
【问题描述】:
我需要使用参数 ID(int) 到 Id(int) 列搜索 ffg 表,如果没有提供 ID,我想返回该表中的所有数据。我在下面尝试过这个查询:
SELECT *
FROM TableName
WHERE Id LIKE ISNULL (@id, '%')
但是这个查询返回错误:
将 varchar 值“%”转换为数据类型时转换失败 诠释。
【问题讨论】:
标签: sql-server
我需要使用参数 ID(int) 到 Id(int) 列搜索 ffg 表,如果没有提供 ID,我想返回该表中的所有数据。我在下面尝试过这个查询:
SELECT *
FROM TableName
WHERE Id LIKE ISNULL (@id, '%')
但是这个查询返回错误:
将 varchar 值“%”转换为数据类型时转换失败 诠释。
【问题讨论】:
标签: sql-server
您正在将整数与“%”进行比较,并且您还使用了 LIKE,这两者都是错误的。 你需要使用这个
SELECT *
FROM TableName
WHERE (Id = @id) or (@id is null)
【讨论】:
这就是你在ISNULL里面要做的事情:
SELECT *
FROM TableName
WHERE ID = ISNULL(@id, ID))
这里,如果@id 为null,则传递ID(列值本身)进行比较,这将始终匹配并导致返回表中的所有数据。
【讨论】:
这是因为ISNULL 规则:
replacement_value 必须是可隐式转换为 check_expresssion 类型的类型。
在你的情况下:
ISNULL(@id, '%')
当@id 为NULL 时,SQL Server 会尝试将'%' 转换为INT,从而导致转换错误。
如果@id 是NULL,要返回所有行,您可以这样做:
SELECT *
FROM TableName
WHERE
(Id = @id OR @id IS NULL)
【讨论】:
你需要对 Id 进行种姓,因为它是整数,所以喜欢:
Where CAST(Id AS TEXT) LIKE '123%')
【讨论】: