SQL 服务器查询系统对象

SQL Server querying system objects

我的主数据库中有一个存储过程。它由提供所有参数的外部程序使用。提供的参数之一是数据库名称。在该数据库中应该有一个名为 xyz 的 table。

当请求的数据库中不存在 table 时,我收到异常。我想在存储过程中写一些东西来检查 table 是否存在,如果 return 不存在则更有用。

这比看起来更棘手。我可以使用动态 SQL 获取可变数据库名称。我可以使用 IF EXISTS(SELECT * FROM SYS.DATABASES WHERE NAME = PARAMETER1).

检查这些数据库是否存在

为了检查 table 是否存在,我需要 USE 数据库,所以我需要使用动态 SQL。但是,这会给我留下一个 executable 变量,而我不知道如何检查该变量的结果(例如,我无法执行 IF EXISTS (EXEC @SQL))。我希望有某种方式可以表达 SELECT * FROM sys.AllDatabasesAllTables WHERE DatabaseName = Parm1 AND TableName = Parm2

我知道 sys.AllDatabasesAllTables 不存在,但我希望也许有人知道另一种方法...有没有一种好的方法可以在存储所有内容的 master 数据库中创建一个视图数据库及其 table 名称?

如文档中所示使用函数 OBJECT_ID()?

https://msdn.microsoft.com/en-US/library/ms190328.aspx

您可以像下面这样使用OBJECT_ID

IF OBJECT_ID('DatabaseName.SchemaName.TableName') IS NOT NULL
BEGIN
 -- Code Here
END
ELSE
BEGIN
 -- Code Here
END
GO

另一种可能的解决方案,但未经过测试,是使用一种 Try-Catch 语句?

BEGIN TRY
     { sql_statement | statement_block }
END TRY
BEGIN CATCH
     [ { sql_statement | statement_block } ]
END CATCH

所以在 catch 块中,您可以 return 您要查找的消息。