Sql 如何检查WITH语句是否为空
拥有CTE,如: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
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