2

暗号化した dbo.CLRSPTest という名前のプロシージャがあります。プロシージャを実行すると実行されますが、sp_helptext CLRSPTest を使用してコードを表示するとエラーがスローされます。Msg 15197, Level 16, State 1, Procedure sp_helptext, Line 107 There is no text for object 'CLRSPTest'.

誰か助けてくれませんか??? 私は困惑しています。

4

1 に答える 1

1

このエラーは、sp_helptext の次のコードによって発生します

 if (select count(*) from syscomments c, sysobjects o where o.xtype not in ('S', 'U')
     and o.id = c.id and o.id = @objid) = 0
   begin
     raiserror(15197,-1,-1,@objname) b
     return (1)
   end

これは単に、行を持たないオブジェクト (テーブルまたはシステム オブジェクトではない) がsyscommentsこのエラーを返すことを意味します。

暗号化されたオブジェクトは、xtext フィールド内のsyscommentsテーブルにレコードを持ってNULLいるため、以前のコードに引っかかることはありません。これらのオブジェクトについて得られるメッセージは、このクエリから来ています。

if (select count(*) from syscomments where id = @objid and encrypted = 0) = 0
  begin
    raiserror(15471,-1,-1,@objname)
    return (0)
  end

では、なぜ最初のものでエラーが発生し、2 番目のものではエラ​​ーが発生しないのでしょうか...これは、 のデータをチェックすることで説明できますmaster..sysmessages

select error, severity, description 
  from master..sysmessages 
 where error in (15197, 15471) 
   and msglangid = 1033

このクエリは次を返します。

error   severity    description
15197   16  There is no text for object '%s'.
15471   10  The text for object '%ls' is encrypted. 

ここでは、エラー 15197 の重大度が 16 で、エラー 15471 の重大度が 10であることがわかります。msdnでは、エラー レベル 0 ~ 9 は「発生」せず、エラー レベル 10 は互換性の理由からエラー レベル 0 に変換されると説明されています。

それで、すべてを結論付けます。プロシージャが SQL CLR プロシージャsyscomments(テーブル内のレコードを取得しない) であるため、このエラー メッセージが表示されます。

于 2013-02-14T14:14:27.967 に答える