在查询之前检查View是否存在

时间:2015-01-05 15:18:52

标签: sql sql-server tsql

我想在查询之前检查特定的View是否存在。我使用动态SQL来创建查询:

DECLARE @sqlCommand varchar(1000)
DECLARE @viewName varchar(1000)
DECLARE @otherDB varchar(1000)

SET @sqlCommand = 'IF EXISTS(SELECT 1 FROM ' + @otherDB + '.sys.views WHERE name=''' + @viewName + ''')
BEGIN
SELECT * FROM ' + @viewName + '
END'

EXEC (@sqlCommand)

只要@viewName确实存在,一切正常。但是,如果@viewName是sys.views中不存在的View,则会从编译器中收到错误:

  

OLE DB提供程序" SQLNCLI11"对于链接服务器" 服务器"不包含表@viewName。该表不存在或当前用户在该表上没有permiossions。

我原以为自从使用IF语句后,它就会跳过查询视图。但是,似乎View 存在,否则我会收到上述错误。

我已经尝试了其他解决方案,例如使用字符串作为View名称,但没有运气。我也在How to check the existence of a view尝试了解决方案,但在某些时候我必须在查询中引用View名称,它会抱怨

任何信息都将非常感谢!

4 个答案:

答案 0 :(得分:1)

检查动态SQL中是否存在外部视图。您正试图阻止select中不存在的视图的编译时错误。 if

没有问题
IF EXISTS(SELECT 1 FROM sys.views WHERE name = @viewName)
BEGIN
    SET @sqlCommand = 'SELECT * FROM ' + @viewName
    EXEC(@sqlCommand)
END;

虽然在这种情况下没有什么区别,但如果您使用的是动态SQL,请了解sp_executesql - 它比exec()更强大,因为您可以传入变量和进行。

编辑:

在这种情况下,您基本上必须在动态SQL中执行动态SQL。以下未经过测试,因此可能存在语法错误:

DECLARE @viewName varchar(1000);
DECLARE @otherDB varchar(1000);

declare @sql nvarchar(max) = '
IF EXISTS (SELECT 1 FROM @otherDB.sys.views WHERE name = ''@viewName'')
BEGIN
    DECLARE @sqlCommand nvarchar(max);
    SET @sqlCommand = ''SELECT * FROM @viewName'';
    EXEC(@sqlCommand);
END;';

SET @sql = replace(replace(@ql, '@otherDB', @otherDB), '@viewName', @viewName);

EXEC(@sql);

答案 1 :(得分:0)

您可以使用不存在的Else条件来设置错误消息

DECLARE @sqlCommand varchar(1000)
DECLARE @viewName varchar(1000)
SET @viewName = 'vwName'
SET @sqlCommand = 'IF EXISTS(SELECT 1 FROM sys.views WHERE name=''' + @viewName + ''')
BEGIN
SELECT * FROM ' + @viewName + '
END
ELSE
BEGIN
SELECT ''View not exists''
END
'    
EXEC (@sqlCommand)

答案 2 :(得分:0)

您使用的是哪个版本的SQL Server?我只有SQL Server 2014可供测试,但下面的T-SQL适用于丢失和不缺少视图。我想知道你是否正在检查otherdb.sys.views中是否存在视图,但是从视图中选择时不符合otherdb的这一事实应该归咎于什么?

declare @viewName varchar(50) = 'MissingView';
declare @sqlCommand nvarchar(1000);
declare @otherdb varchar(20) = 'MyTestDatabase';

set @sqlCommand = N'if exists
    (
        select 1
        from ' + @otherdb + '.sys.views as v
        where v.name = ''' + @viewName + '''
    )
    begin
        select * from ' + @otherdb + '.dbo.' + @viewName + ';
    end
    else 
    begin
        select ''Nah mate - missing view'';
    end';


print @sqlCommand;

execute sp_executesql @sqlCommand;

答案 3 :(得分:0)

请注意您的视图是否在不同的模式中,因为那时您还需要检查SCHEMAS表:

SELECT 1 FROM SYS.VIEWS 
INNER JOIN SYS.SCHEMAS ON SYS.SCHEMAS.schema_id = SYS.VIEWS.schema_id
WHERE SYS.VIEWS.TYPE='V'
    AND SYS.SCHEMAS.NAME=@Your_Schema_Name  
    AND SYS.VIEWS.NAME=@Your_View_Name