Sql server SQL Server查询系统对象

Sql server SQL Server查询系统对象,sql-server,dynamic-sql,system-tables,Sql Server,Dynamic Sql,System Tables,我的主数据库中有一个存储过程。它由提供所有参数的外部程序使用。提供的参数之一是数据库名称。在该数据库中应该有一个名为xyz的表 当请求的数据库中不存在该表时,我收到一个异常。我想在存储过程中写入一些内容来检查该表是否存在,如果不存在,则返回一些更有用的内容 这比看起来更棘手。我可以使用动态SQL获取变量数据库名称。我可以使用if exists select*从SYS.databases中检查这些数据库是否存在,其中NAME=PARAMETER1 为了检查表是否存在,我需要使用数据库,因此需要使用

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

当请求的数据库中不存在该表时,我收到一个异常。我想在存储过程中写入一些内容来检查该表是否存在,如果不存在,则返回一些更有用的内容

这比看起来更棘手。我可以使用动态SQL获取变量数据库名称。我可以使用if exists select*从SYS.databases中检查这些数据库是否存在,其中NAME=PARAMETER1

为了检查表是否存在,我需要使用数据库,因此需要使用动态SQL。但是,这会给我留下一个可执行变量,我不知道如何检查该变量的结果。例如,如果EXEC@SQL存在,我就不能这样做。我希望有某种方式可以说SELECT*FROM sys.AllDatabasesAllTables,其中DatabaseName=Parm1和TableName=Parm2


我意识到sys.AllDatabasesAllTables并不存在,但我希望有人知道另一种方法。。。在主数据库中创建一个存储所有数据库及其表名的视图有什么好方法吗?

使用文档中所示的函数对象ID


是否使用文档中所示的函数对象ID

您可以按如下方式使用:

IF OBJECT_ID('DatabaseName.SchemaName.TableName') IS NOT NULL
BEGIN
 -- Code Here
END
ELSE
BEGIN
 -- Code Here
END
GO
另一个可能的解决方案,但没有测试,是使用一种声明

BEGIN TRY
     { sql_statement | statement_block }
END TRY
BEGIN CATCH
     [ { sql_statement | statement_block } ]
END CATCH
因此,在catch块中,您可以返回您正在查找的消息。

您可以使用如下命令:

IF OBJECT_ID('DatabaseName.SchemaName.TableName') IS NOT NULL
BEGIN
 -- Code Here
END
ELSE
BEGIN
 -- Code Here
END
GO
另一个可能的解决方案,但没有测试,是使用一种声明

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

因此,在catch块中,您可以返回您要查找的消息。

您可以在master中创建一个视图,对每个数据库进行sys.tables和sys.columns的并集,但它不是动态的。老实说,这听起来像是一场维护噩梦,我会立即逃离,如果不是更早的话。我认为在这种情况下使用动态sql会更好。您可以在master中创建一个视图,为每个数据库合并sys.tables和sys.columns,但它不是动态的。老实说,这听起来像是一场维护噩梦,我会立即逃离,如果不是更早的话。我认为在这种情况下使用动态sql会更好。