我想在查询之前检查特定的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名称,它会抱怨
任何信息都将非常感谢!
答案 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