同时获取模式名和表名

本文关键字:模式 获取 | 更新日期: 2023-09-27 18:15:45

我将陈述在SQL服务器上的随机数据库中有一些表和一些存储过程的状态。这些表和SP的命名格式如下:

[schema name].[table name]

[schema name].[sp name]

我的任务是捕获这两个值,无论是表名还是SP。

我已经在c#上执行了下面的语句(其中包含4个SQL查询),然后通过SqlDataReader读取输出值,我认为我已经将模式名称与旁边的表/SP名称相匹配。他们中的大多数人都这样做了,但我需要让他们都正确匹配。

if (requestCode == 1)
{
    SetSpecificList("USE " + db_name + "; SELECT * FROM sys.tables", "USE " + db_name + "; SELECT * FROM INFORMATION_SCHEMA.TABLES", tablesList, requestCode);
}
else if (requestCode == 2)
{
   SetSpecificList("USE " + db_name + "; SELECT * FROM sys.procedures", "USE " + db_name + "; SELECT * FROM INFORMATION_SCHEMA.ROUTINES", SPList, requestCode);
}

如何在两个查询中组合两个SQL语句(简单地一个语句)来获取表/SP的全名,而不是将其划分为[schema name][table name] ?

同时获取模式名和表名

由于本文中概述的原因,我总是倾向于使用系统目录视图而不是INFORMATION_SCHEMA,并且我不能100%确定您为什么在这种情况下同时使用这两种视图…

无论如何,您可以使用OBJECT_SCHEMA_NAME()函数,例如

SELECT  TableName = QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name)
FROM    sys.tables AS t;

或者你可以加入sys.schemas:

SELECT  TableName = QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
FROM    sys.tables AS t
        INNER JOIN sys.schemas AS s
            ON s.schema_id = t.schema_id;
            

无论如何,您可以从同一个表中取出过程和表(以及所有其他对象):

SELECT  ObjectName = QUOTENAME(s.name) + '.' + QUOTENAME(o.name),
        ObjectType = o.type_desc
FROM    sys.all_objects AS o
        INNER JOIN sys.schemas AS s
            ON s.schema_id = o.schema_id
WHERE   o.[type] IN ('U', 'P');