撰写运行的查询,无论表是否存在

时间:2014-10-23 19:03:27

标签: sql-server

这是一个有趣的。我有一个视图,突然需要跨数据库的不同版本(外部工具)运行。我喜欢做的只是让一个查询正常工作(使用任何形式的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"处理可能缺少的列(我也在使用它)的技巧。

1 个答案:

答案 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。

但是,也许我很想念。你写了"行数" ...嗯,我想我需要更多的输入。