【问题标题】:Current executing procedure name当前执行过程名称
【发布时间】:2011-08-27 10:18:17
【问题描述】:

MS SQL Server 中是否可以获取当前存储过程的名称?

也许有像GETDATE()这样的系统变量或函数?

【问题讨论】:

    标签: sql-server sql-server-2008 tsql stored-procedures


    【解决方案1】:

    你可以试试这个:

    SELECT OBJECT_NAME(@@PROCID)
    

    更新:此命令在 SQL Server 2016 上仍然有效。

    【讨论】:

    • 值得注意的是返回值是SYSNAME类型的。
    • 函数不是程序怎么办?任何想法?请帮忙
    • 在 SQL Serve 2012 上仍然有效
    • 在 SQL Server 2016 上仍然有效
    • 不适用于会话或全局临时存储过程。
    【解决方案2】:
    OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)
    

    【讨论】:

    • 如果您在临时 Proc 中使用它,它会返回 NULL,无论是否检索模式名称。第一个 proc 是“正常”,第二个是 temp,在此代码中:BEGIN TRAN GO CREATE PROC utility.TempProc AS SELECT OBJECT_SCHEMA_NAME(@@PROCID)+'.'+OBJECT_NAME(@@PROCID) GO EXEC utility.TempProc GO ROLLBACK GO BEGIN TRAN GO CREATE PROC utility.#TempProc AS SELECT OBJECT_SCHEMA_NAME(@@PROCID)+'.'+OBJECT_NAME(@@PROCID) GO EXEC utility.#TempProc GO ROLLBACK GO
    【解决方案3】:

    您可以使用OBJECT_NAME(@@PROCID)

    返回的对象标识符(ID) 当前的 Transact-SQL 模块。一种 Transact-SQL 模块可以存储 过程,用户定义的函数,或 触发。

    【讨论】:

      【解决方案4】:

      如果您对当前正在执行的临时存储过程的名称感兴趣,您可以通过以下方式获取:

      select name
      from tempdb.sys.procedures
      where object_id = @@procid
      

      您不能使用 SQL Server 中接受的答案来查找当前正在执行的临时存储过程的名称:

      create procedure #p
      as
      select object_name(@@PROCID) as name
      go
      exec #p
      
      
      name
      --------------------------------------------------------------------------------------------------------------------------------
      NULL
      
      (1 row affected)
      

      【讨论】:

      • 可以确认,在 Enterprise 2014 中测试,在 2008R2 兼容模式下使用会话范围(双##)
      • 事实上,这是正确的:谁会创建临时程序?? :-D
      【解决方案5】:

      我知道这是旧的,但这是我使用的。它似乎总是有效。

      BEGIN TRAN 
      GO 
      -- Stored procedure, function of trigger
      CREATE PROC dbo.TempProc AS 
          DECLARE @ DATETIME = GETDATE(), @Me VARCHAR(64) = COALESCE(OBJECT_SCHEMA_NAME(@@PROCID, DB_ID()), OBJECT_SCHEMA_NAME(@@PROCID, DB_ID('tempdb')),'session')+'.'+COALESCE(OBJECT_NAME(@@PROCID, DB_ID()) , OBJECT_NAME(@@PROCID, DB_ID('tempdb')),'SQL')
          SELECT ProcName = @Me
      GO
      EXEC dbo.TempProc 
      GO
      ROLLBACK 
      GO
      BEGIN TRAN 
      GO
      -- Temp Stored procedure
      CREATE PROC #TempProc AS 
          DECLARE @ DATETIME = GETDATE(), @Me VARCHAR(64) = COALESCE(OBJECT_SCHEMA_NAME(@@PROCID, DB_ID()), OBJECT_SCHEMA_NAME(@@PROCID, DB_ID('tempdb')),'session')+'.'+COALESCE(OBJECT_NAME(@@PROCID, DB_ID()) , OBJECT_NAME(@@PROCID, DB_ID('tempdb')),'SQL')
          SELECT ProcName = @Me
      GO
      EXEC #TempProc 
      GO
      ROLLBACK
      GO
      -- SSMS or direct SQL statement
      DECLARE @ DATETIME = GETDATE(), @Me VARCHAR(64) = COALESCE(OBJECT_SCHEMA_NAME(@@PROCID, DB_ID()), OBJECT_SCHEMA_NAME(@@PROCID, DB_ID('tempdb')),'session')+'.'+COALESCE(OBJECT_NAME(@@PROCID, DB_ID()) , OBJECT_NAME(@@PROCID, DB_ID('tempdb')),'SQL')
      SELECT ProcName = @Me
      

      【讨论】:

        【解决方案6】:

        您可以在获取存储过程的架构和名称之前检查NULL

        这意味着即使是(全局)临时存储过程,您也可以获得正确的数据(点击图片放大):

        USE [master]; --so we can test temp sprocs without cheating by being in tempdb.
        GO
        
        BEGIN TRAN;
        GO
        
        CREATE PROC dbo.NotTempProc
        AS
        BEGIN
            SELECT CASE
                WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
                THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
                ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
                END AS ProcName;
        END
        GO
        
        EXEC dbo.NotTempProc;
        GO
        
        CREATE PROC dbo.#TempProc
        AS
        BEGIN
            SELECT CASE
                WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
                THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
                ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
                END AS ProcName;
        END
        GO
        
        EXEC dbo.#TempProc;
        GO
        
        CREATE PROC dbo.##GlobalTempProc
        AS
        BEGIN
            SELECT CASE
                WHEN OBJECT_SCHEMA_NAME(@@PROCID) IS NULL
                THEN OBJECT_SCHEMA_NAME(@@PROCID, 2) + N'.' + OBJECT_NAME(@@PROCID, 2)
                ELSE OBJECT_SCHEMA_NAME(@@PROCID) + N'.' + OBJECT_NAME(@@PROCID)
                END AS ProcName;
        END
        
        
        GO
        
        EXEC dbo.##GlobalTempProc;
        GO
        
        ROLLBACK;
        

        【讨论】:

          猜你喜欢
          • 2018-11-05
          • 1970-01-01
          • 2012-07-28
          • 2010-10-01
          • 2018-09-15
          • 1970-01-01
          • 2018-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多