sql-server - 将 varchar 值 'N' 转换为数据类型 int 时转换失败

标签 sql-server sql-server-2008

这是在 SQL Server 2008 R2 中。

我正在用这个来拉扯我的头发。请密切关注。

当我运行它时,我返回了 27 行:

select * 
from dbo.[12STD_NO_VISIT] 
where (
         (dbo.fPhoneExists(PhoneNumber1) = 1  
         AND (NextCall1 BETWEEN GETDATE() AND DATEADD(hh, 1, GETDATE())))
      )

当我运行它时,我返回了 21 行(注意 PhoneNumber2 和 NextCall2 的变化):

select * 
from dbo.[12STD_NO_VISIT] 
where (
          (dbo.fPhoneExists(PhoneNumber2) = 1  
           AND (NextCall2 BETWEEN GETDATE() AND DATEADD(hh, 1, GETDATE())))
      )

但是,当我运行这个,对 2 个条件进行“或运算”时,我得到了一个错误:

Conversion failed when converting the varchar value 'N' to data type int

select * 
from dbo.[12STD_NO_VISIT] 
where (
          (dbo.fPhoneExists(PhoneNumber1) = 1  
           AND (NextCall1 BETWEEN GETDATE() AND DATEADD(hh, 1, GETDATE())))
       OR  
          (dbo.fPhoneExists(PhoneNumber2) = 1
           AND (NextCall2 BETWEEN GETDATE() AND  DATEADD(hh, 1, GETDATE())))
      )

但它不只是给我错误。它首先检索 42 行,将其显示一瞬间(“结果”选项卡),然后显示错误(“消息”选项卡)。

我想不通这个。非常感谢任何帮助。

谢谢!

FUNCTION [dbo].[fPhoneExists](@PhoneNumber varchar) 
RETURNS BIT 
WITH EXECUTE AS CALLER 
AS 
BEGIN 
DECLARE @GoodNumber bit 
IF (@PhoneNumber is NULL or @PhoneNumber = 0 or @PhoneNumber = '') 
  SET @GoodNumber = 0; 
ELSE 
  SET @GoodNumber = 1; 
  Return(@GoodNumber); 
END

最佳答案

PhoneNumber1PhoneNumber2 的数据类型是什么? dbo.fPhoneExists 的定义是什么?我怀疑问题出在某个地方 - 或者正如 Lynn 所建议的那样,查询可能比您向我们展示的更多(查询要么成功要么失败;它不会产生 42 行然后出现错误)。

现在我们看到了这个函数,这里是一个重写:

ALTER FUNCTION [dbo].[fPhoneExists]
(
  @PhoneNumber VARCHAR -- varchar(what)? This should match definition of column
) 
RETURNS BIT 
WITH EXECUTE AS CALLER 
AS 
BEGIN
  RETURN (SELECT CASE WHEN COALESCE(@PhoneNumber, '') IN ('0', '') THEN 0 ELSE 1 END);
END
GO

没有理由将临时逻辑存储在变量中,还请注意,您在 ELSE 条件中返回变量。

关于sql-server - 将 varchar 值 'N' 转换为数据类型 int 时转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10215171/

相关文章:

sql-server - 仅当 SQL Server 中满足条件时才触发触发器

sql - 通过动态调用使用 SQLCMD 的更智能方式

c# - SqlGeography 空间操作缓慢 - SQL Server 2016

hibernate - MS SQL Server 2008 R2 IDENTITY 列的 JPA 注释

sql - 通过 SQL 代码识别候选主键

sql-server - T-SQL Cross Join 获取缺失值

sql-server-2008 - SQL 程序集与大型 XML 列上复杂查询的应用程序代码

sql-server - TSQL - 将分隔的字符串拆分为列

sql - 在没有游标的情况下合并单个SQL表中的数据

sql-server - SQL Server 代理服务的凭据无效