Не удается найти функцию поиска, вызываемую в процедуре - PullRequest
2 голосов
/ 20 декабря 2011

Я новичок в SQL Server. У меня есть проблема, где у нас есть хранимая процедура под названием sys.sp_MSallocate_new_identity_range (см. Часть логики ниже). Он ссылается на две функции, ни одну из которых я не могу найти.

if (**sys.fn_MSmerge_isrepublisher**(@artid)=0)
    begin
        declare @publisher_max_used numeric(38,0)
        declare @pubid uniqueidentifier
        declare @pub_ranges_needed tinyint
        declare @pub_refresh_constraint bit

        select @pubid = subid, @publisher_max_used = max_used from dbo.MSmerge_identity_range 
            where artid = @artid and is_pub_range = 1 and (**sys.fn_MSmerge_islocalpubid**(subid)=1)
        if @pubid is NULL
        begin
            raiserror(20663, 16, -1)
            return 1
        end

Выполнение сохраненного prcoedure с соответствующими параметрами - возвращает результат:

declare @p4 smallint
set @p4=2
declare @p5 numeric(38,0)
set @p5=31001
declare @p6 numeric(38,0)
set @p6=32001
declare @p7 numeric(38,0)
set @p7=32001
declare @p8 numeric(38,0)
set @p8=33001
exec sys.sp_MSallocate_new_identity_range 'B551D87F-5457-2102-9E6A-DD4EB44B1DD1','4EB5E2D0-3FC1-4D77-B894-5D57C433D0B2',2,@p4 output,@p5 output,@p6 output,@p7 output,@p8 output,N'dev_02',N'PPC04 - 21a535007fd8',N'My Documents\Assets\assets.sdf'
select @p4, @p5, @p6, @p7, @p8

Т.е. это работает и возвращает результат. Все хорошо - но я не могу найти функции, встроенные в хранимую процедуру, т.е. sys.fn_MSmerge_isrepublisher или sys.fn_MSmerge_islocalpubid.

Я посмотрел в sys.objects и sys.all_objects where name like '%fn_MSmerge%'.

Мне удалось отследить SQL, и трассировка дает ObjectID, и я вижу, как выполняется оператор. След говорит мне, что это функция - 20038 - FN - и дает мне объект 563464549 - но не может найти, посмотрев в sys.objects для базы данных

Любая помощь / совет с радостью приняты.

1 Ответ

1 голос
/ 20 декабря 2011

Эти определения объектов кажутся скрытыми.Если вы подключаетесь через ЦАП и запускаете

SELECT OBJECT_DEFINITION(OBJECT_ID('sys.fn_MSmerge_islocalpubid'))  AS
       [processing-instruction(x)],
       OBJECT_DEFINITION(OBJECT_ID('sys.fn_MSmerge_isrepublisher')) AS
       [processing-instruction(y)]
FOR XML PATH('')  

, вы можете их увидеть.Определения для моей версии SQL Server приведены ниже

create function sys.fn_MSmerge_islocalpubid (@pubid uniqueidentifier)
returns bit
as
begin
    declare @publisher_db sysname
    declare @publisher sysname

    select @publisher_db = publisher_db, @publisher = publisher 
    from dbo.sysmergepublications 
    where pubid = @pubid
    if @publisher_db is NULL or @publisher is NULL
        return 0

    if @publisher_db = db_name() and UPPER(@publisher) = UPPER(publishingservername())
        return 1

    return 0
end


create function sys.fn_MSmerge_isrepublisher (@artid uniqueidentifier)
returns bit
as
begin
    if exists (select pubid from dbo.sysmergearticles where artid = @artid and (sys.fn_MSmerge_islocalpubid(pubid) = 0))
        return 1

    return 0
end
...