【问题标题】:How do I include a stored procedures schema name in a select statement如何在选择语句中包含存储过程架构名称
【发布时间】:2019-09-09 15:54:20
【问题描述】:

我想选择我的数据库中的所有存储过程,并以它们的模式名称开头。

例如,我希望我的输出列显示dbo.stored_procedure 而不仅仅是stored_procedure

所以我正在寻找类似

select SCHEMA_NAME + '.' + name
from sys.procedures
order by name

但这不起作用,因为schema_name 是无效的列名

【问题讨论】:

  • sys.procedures 表中是否有名为SCHEMA_NAME 的列?你不能随便编一个列名,然后期望 SQL Server 神奇地显示你期望的值。
  • 我怀疑 OP 混淆了 sysINFORMATION_SCHEMA 对象,@Eric,确实有一个名为 SCHEMA_NAME 的列。

标签: sql sql-server tsql sql-server-2016


【解决方案1】:

如果您使用 sys 对象,架构名称位于不同的对象中:

SELECT QUOTENAME(s.name) + N'.' + QUOTENAME(p.name)
FROM sys.procedures p
     JOIN sys.schemas s ON p.schema_id = s.schema_id
ORDER BY p.name;

【讨论】:

    【解决方案2】:

    sys.procedures 有一个字段schema_id,它是sys.schemas 的外键。所以你只需要加入它

    select s.name + '.' + p.name
    from sys.procedures p
    inner join sys.schemas s
        on p.schema_id = s.schema_id
    order by p.name
    

    【讨论】:

      【解决方案3】:

      你可以使用INFORMATION_SHEMA.ROUTINES:

      select ROUTINE_SCHEMA + '.' + ROUTINE_NAME
      from INFORMATION_SCHEMA.ROUTINES
      where ROUTINE_TYPE = 'PROCEDURE';
      

      您可以使用SPECIFIC_ROUTINE_。但是,SPECIFIC_ 用于重载过程(即两个具有相同名称但采用不同参数的过程)。 SQL Server 不支持这一点。但是,如果是这样,您将需要通用名称。

      【讨论】:

        【解决方案4】:

        您可以使用 SCHEMA_NAME() 函数获取架构名称为

        SELECT CONCAT(QUOTENAME(SCHEMA_Name(schema_id)), N'.', QUOTENAME(Name)) Result
        FROM Sys.Procedures
        ORDER BY Name;
        

        【讨论】:

          【解决方案5】:
          select SPECIFIC_SCHEMA + '.' + SPECIFIC_NAME
          from INFORMATION_SCHEMA.ROUTINES
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-21
            • 2011-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多