CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真
Posted
技术标签:
【中文标题】CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真【英文标题】:CASE WHEN SQL Query executes condition in else even if first condition is true 【发布时间】:2020-12-22 10:34:31 【问题描述】:我正在尝试检查表中是否存在数据。首先我检查表是否存在,然后我使用 SELECT 语句检查表是否为空
DECLARE @dataExists BIT = 0
SELECT
@dataExists = CASE
WHEN OBJECT_ID('TableName') IS NULL
THEN 0
ELSE CASE
WHEN EXISTS(SELECT 1 FROM TableName)
THEN 1
ELSE 0
END
END
SELECT @dataExists
如果 OBJECT_ID('TableName')
返回 NULL,我有这个不应该执行的查询 SELECT 1 FROM TableName
但这个查询继续并执行
SELECT 1 FROM TableName
这当然会引发错误
无效的对象名称表名
【问题讨论】:
基本上是dba.stackexchange.com/questions/43352/…的重复 【参考方案1】:尝试以下方法:
DECLARE @dataExists BIT = 0
IF OBJECT_ID('TableName') IS NOT NULL
BEGIN
SET @dataExists = (SELECT TOP 1 1 FROM TableName)
END
SELECT @dataExists
您遇到的错误是编译错误。因为它是一个单一的声明。 SQL Server 需要构建执行计划,如果表不存在,则不能这样做。
通过添加IF
,如果不满足条件,则不需要“编译”语句。
使用动态 SQL:
DECLARE @TableName SysName = 'TableName'
DECLARE @Sql NVARCHAR(MAX) = '
DECLARE @dataExists BIT = 0
IF OBJECT_ID('''+@TableName+''') IS NOT NULL
BEGIN
SET @dataExists = (SELECT TOP 1 1 FROM '+QUOTENAME(@TableName)+')
END
SELECT @dataExists
'
EXEC (@Sql)
【讨论】:
有没有办法使用动态SQL实现以上目标? 当然可以,但是为什么非动态 SQL 不够用呢?您是否需要使用动态 SQL?如果是这样,应该从一开始就提到这一点。 我怎样才能追加'??以上是关于CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真的主要内容,如果未能解决你的问题,请参考以下文章