这是一个有趣的。我有一个视图,突然需要跨数据库的不同版本(外部工具)运行。我喜欢做的只是让一个查询正常工作(使用任何形式的CASE / IF EXISTS或魔术技巧与交叉连接或你有什么)。
基本上,如果给定的表存在,我想返回该表中的行数...如果它没有,我想返回NULL。
"表"此问题的版本,它处理如何编写查询,无论表中是否存在给定列:https://dba.stackexchange.com/questions/66741/why-cant-i-use-a-case-statement-to-see-if-a-column-exists-and-not-select-from-i
我无法使用
CASE WHEN EXISTS (SELECT 1 FROM sys.tables WHERE [object_id] = OBJECT_ID('possibleTable')
THEN (SELECT COUNT(1) FROM possibleTable WHERE mycondition)
ELSE (SELECT NULL)
END
...因为当表不存在时会出错,因为它会在编译时尝试绑定,即使代码在表格不存在时也永远不会运行。
基本上我必须增加CTE以包括新表的计数,但如果表不在那里则不会失败。不得不再次往数据库进行检查以检查表格是否存在,然后运行两个不同的CTE中的一个对我来说似乎很令人讨厌...但到目前为止我还没有找到更好的方法。
只是好奇是否有任何SQL魔法可以使这样的事情发挥作用,就像那个有趣的" CROSS JOIN"处理可能缺少的列(我也在使用它)的技巧。
答案 0 :(得分:0)
为什么不使用函数?
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION [dbo].[fn_checktable]
(
-- Add the parameters for the function here
@checktable nvarchar(max)
)
RETURNS nvarchar(100)
AS
BEGIN
-- Declare the return variable here
DECLARE @result int
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@checktable+']') AND type in (N'U'))
set @result = 1
else
set @result = 0
endsave:
-- Return the result of the function
RETURN @result
END
GO
然后使用
select case when dbo.fn_checktable('YOURTABLENAME') = 1
then (select top 1 'whatever' from YOURTABLENAME )
else 'nothing' end as something
select dbo.fn_checktable(' YOURTABLENAME')的结果为1或0。
但是,也许我很想念。你写了"行数" ...嗯,我想我需要更多的输入。