2011-12-19 15 views
2

私はSQL Serverを初めて使用しています。私はsys.sp_MSallocate_new_identity_rangeと呼ばれるストアドプロシージャがある問題があります(下記のロジックの一部を参照)。それはどちらも私が見つけることができる2つの機能を参照しています。プロシージャで呼び出された検索関数が見つかりません

適切なパラメータを使用して格納されているprcoedure実行
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 

- 結果を返す:

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.objectssys.all_objects where name like '%fn_MSmerge%'を調べました。

私はSQLをトレースすることができました。そしてトレースはObjectIDを与え、私はその文を実行することができます。トレースは私にそれが関数であることを教えてくれます。 20038 - FN - 563464549のオブジェクトIDを与えますが、sys.objectsでデータベースを探すことができません。

喜んで受け入れられているヘルプ/アドバイス。

+0

実際の問題は何ですか?この手続きは、身分証明されておらず、あなた自身を呼び出すことが期待されない内部システム手続きです。経験している実際の問題を記述すると、誰かが解決策を提供できる可能性があります。 – Pondlife

答えて

1

これらのオブジェクト定義は隠されているようです。 DAC経由で接続して実行すると、

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 
+0

ありがとうMartin - コードを表示してプロファイラを使用すると、データの問題を解決するのに役立ちました。私たちは2005年を使用していたし、デバッガを持っていなかったので、ストアドプロシージャと関数が実際に行っていたことを確認できる大きな助けとなりました。乾杯 – user1106857

関連する問題