【问题标题】:Use Sql LIKE in TableAdapter for int values在 TableAdapter 中使用 Sql LIKE 获取 int 值
【发布时间】:2015-06-01 06:15:34
【问题描述】:

我想使用TableAdapter 配置向导中的参数创建自己的查询。

所以在这之后我使用了这段代码,但它是错误的:

SELECT Name, ProjID
FROM ProjectTable
WHERE (ProjID LIKE @ProjID% )

因为>>语法错误new ')',所以很清楚。

经过一番搜索,有同样问题的人建议使用这样的东西:

SELECT Name, ProjID
FROM ProjectTable
WHERE (ProjID LIKE @ProjID + '%')

但它仍然是错误的,并在运行时给我这个错误:

将 varchar 值“%”转换为数据类型 int 时转换失败。

这也很清楚,因为我在指向 int 数据类型的查询中使用了 +'%'。

那么,我该如何解决这个问题(我的意思是为TableAdapter 中的查询创建一个参数,专门针对int 数据类型)?

提前致谢

【问题讨论】:

  • 您不能对 int 进行 LIKE。它用于 varchar

标签: c# sql sql-server sql-like tableadapter


【解决方案1】:

您只能对字符串执行 LIKE 操作。所以你可以这样做:

SELECT        Name, ProjID
FROM            ProjectTable
WHERE        CAST(ProjID AS varchar(31)) LIKE CAST(@ProjID AS varchar(31))+'%' 

【讨论】:

    【解决方案2】:

    听起来@ProjID 是一种数字数据类型。在将 % 附加到它之前,您需要将其转换为 varchar。

    我不确定您使用的是什么 sql,如果是 Sql Server 变体,请尝试

    SELECT        Name, ProjID
    FROM            ProjectTable
    WHERE        (cast(ProjID as varchar(30) LIKE cast(@ProjID as varchar(30)) +'%' )
    

    您可能需要将 varchar(30) 调整为更大或更小的值,以适应您的值的大小。 ProjID 将自动转换为 varchar 以进行比较,但最好也专门转换它。

    这不会是最有效的查询。由于列名上的强制转换(隐式或显式),它不会使用您为其定义的任何索引。

    【讨论】:

    • 这点效率不高。转换为 varchar 并执行 LIKE 操作会完全消除通过使用 int 列获得的任何性能。我觉得有更好的方法来完成 OP 想要的。
    • @Kalmino 您可能会欣赏我的回答,因为它的价值。感谢您指出我最初的错误。
    【解决方案3】:

    您可以完全避免 VARCHAR 的混乱。

    SELECT Name, ProjID
    FROM ProjectTable
    WHERE ProjID = @ProjID OR ProjID >= 10 * @ProjID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2023-02-15
      • 1970-01-01
      • 2012-02-05
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多