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()?
您可以像下面这样使用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 您要查找的消息。
我的主数据库中有一个存储过程。它由提供所有参数的外部程序使用。提供的参数之一是数据库名称。在该数据库中应该有一个名为 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()?
您可以像下面这样使用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 您要查找的消息。