Есть ли способ сохранить хранимую процедуру для ссылки на ее собственное имя? Скажем, я хочу, чтобы он печатал собственное имя, но без жесткого кодирования имени в хранимой процедуре. Есть ли способ обмана, чтобы получить имя или идентификатор из самой процедуры без использования фактического имени для поиска информации?
Может ли хранимая процедура MS/Transact-SQL искать собственное имя?
Ответ 1
Try:
SELECT OBJECT_NAME(@@PROCID)
@@PROCID возвращает идентификатор объекта текущего модуля SQL. OBJECT_NAME переводит идентификатор объекта в его имя. Оба доступны по меньшей мере с версии 7 по 2008 SQL Server.
Ответ 2
Вы ищете @@PROCID и OBJECT_NAME i.e.
select @procName=OBJECT_NAME(@@PROCID)
Ответ 3
Название proc/func
Select OBJECT_NAME(@@PROCID);
Другие интересные вещи
Select * From sys.sysprocesses Where spid = @@SPID
Ответ 4
Вот код, который я написал, работая с базой данных SQL Server 2005, чтобы играть с функцией OBJECT_NAME (@@PROCID).
Сначала запустите этот раздел, чтобы создать таблицу журналов
CREATE TABLE Diagnostics_Log
(
sprocName sysname,
WhenRun datetime,
Comment Varchar(160) NULL
)
- ========================================
Затем запустите этот T-SQL, чтобы создать несколько версий одного и того же sproc, добавляя числовой суффикс каждый раз.
CREATE PROC dg_test_name_logging
@Comment Varchar(160)
AS
declare @Sprocname sysname
select @sprocName = OBJECT_NAME(@@PROCID)
PRINT @@PROCID
print @sprocname
insert into Diagnostics_Log VALUES (@sprocname, GetDate(), @Comment)
GO
- ========== Затем запустите этот раздел
exec dg_test_name_logging 'this is the first run'
WAITFOR DELAY '00:00:00:123'
exec dg_test_name_logging1 'this is my second comment'
WAITFOR DELAY '00:00:00:123'
exec dg_test_name_logging2 'yet another comment'
WAITFOR DELAY '00:00:02:123'
exec dg_test_name_logging3 'amazing'
WAITFOR DELAY '00:00:00:123'
exec dg_test_name_logging4 'I''ll be gobsmacked if this works'
WAITFOR DELAY '00:00:00:123'
exec dg_test_name_logging5 'It' ALIVE !!!'
select * from Diagnostics_Log
Может быть полезно для ведения журнала при запуске или доступе sprocs или views.
Ответ 5
object_name() сам по себе не указывает схему текущего объекта. Для этого:
print object_schema_name(@@PROCID) + '.' + object_name(@@PROCID)