这是在 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
最佳答案
PhoneNumber1
和PhoneNumber2
的数据类型是什么? 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/