Sql 如何检查WITH语句是否为空

Sql 如何检查WITH语句是否为空,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,拥有CTE,如: WITH fnl as (select lo.id , s.service_name , lo.obj_name , ........ from dbo.r_objects ro inner join dbo.services s on ro.service_id = s.id inner join dbo.local_objects lo on ro.local_object_id = lo.id where ro.serv

拥有CTE,如:

WITH fnl as
    (select lo.id , s.service_name , lo.obj_name ,
    ........
    from dbo.r_objects ro
    inner join dbo.services  s on ro.service_id = s.id 
    inner join dbo.local_objects lo on ro.local_object_id = lo.id
    where ro.service_id = @service_id
)
    select id , service_name , CAST(obj_name as varbinary(200)) obj_name
    FROM fnl 
    WHERE ....... some logic
它的工作很好。现在我想检查fnl中的数据是否为空,然后写入“数据为空” 我想:

WITH fnl as
    (select lo.id , s.service_name , lo.obj_name ,
    ........
    from dbo.r_objects ro
    inner join dbo.services  s on ro.service_id = s.id 
    inner join dbo.local_objects lo on ro.local_object_id = lo.id
    where ro.service_id = @service_id
)
    select @table_count = COUNT(*) from fnl 
IF @table_count > 0
begin
    select id , service_name , CAST(obj_name as varbinary(200)) obj_name
    FROM fnl 
    WHERE ....... some logic
    end

else
  set @check = 'Data is empty'
  ...............some logic here 
当i exec过程出现错误时:无效的对象名称“fnl”如何检查它是否为空?如果存在,我会尝试,但也有错误

编辑:
*我解决它,创建tbl,然后将fnl中的所有数据插入tbl,因为在CTE fnl中,您只能使用一次,我使用了两次,但出现了错误。然后检查是否存在这样的数据:*如果存在,请从tbl中选择top 1如果存在数据,请从tbl中选择数据,否则请使用一些逻辑,我认为CTE不适合用于您的查询。我最好做这样的事。代替你的CTE,只需将你拥有的东西放在子选择中即可。以后您可以继续检查您的VARABLE

DECLARE @table_count INT
SELECT @table_count = COUNT(*)
   FROM ( SELECT somestuff
      FROM SOMEtables ) a

我认为CTE不适合用于您的查询。我最好做这样的事。代替你的CTE,只需将你拥有的东西放在子选择中即可。以后您可以继续检查您的VARABLE

DECLARE @table_count INT
SELECT @table_count = COUNT(*)
   FROM ( SELECT somestuff
      FROM SOMEtables ) a

公共表表达式仅存在于下一个SQL语句中。考虑调整你的方法-为什么在这个阶段检查数据是否是空的?这种检查最好在应用程序端处理

或者,如果您确实希望在数据库中执行此操作,您可以执行以下操作:

使用内联表值函数 使用表参数存储数据 使用SQL语句的精简版本进行检查。此外,在确定是否有数据时,使用EXISTS优于进行计数。
公共表表达式仅存在于下一个SQL语句中。考虑调整你的方法-为什么在这个阶段检查数据是否是空的?这种检查最好在应用程序端处理

或者,如果您确实希望在数据库中执行此操作,您可以执行以下操作:

使用内联表值函数 使用表参数存储数据 使用SQL语句的精简版本进行检查。此外,在确定是否有数据时,使用EXISTS优于进行计数。
@usr I更新了帖子,在else语句中将有一些逻辑,如果fnl将为空,那么Anon的回答如下所示,您可能不需要CTE。fnl没有连接,所以它不是真正的递归,对吗?但由于您的检查是在加载tbl之后进行的,因此有一个选项比您和Anon使用的IF EXISTS更快:IF@@rowcount>0@usr我更新了帖子,在else语句中会有一些逻辑,如果fnl将为空,那么Anon的回答如下所示,您可能不需要CTE。fnl没有连接,所以它不是真正的递归,对吗?但由于您的检查是在加载tbl之后进行的,因此有一个选项比您和Anon使用的IF EXISTS更快:IF@@rowcount>0