我寫了一個SQLCLR的UDF(User Defined Function),對傳入的字串做了些處理再傳回:

   1:  [Microsoft.SqlServer.Server.SqlFunction]
   2:  public static SqlString DoSomething(SqlString inpString)
   3:  {
   4:  if (compString.IsNull)
   5:      return SqlString.Null;
   6:  else
   7:      return new SqlString(
   8:          MyUtilClass.Blah(inpString.ToString())
   9:      );
  10:  }

 起先測試一些小字串,結果都正常,沒想到要開始玩真的,傳入一個數百K的大字串時,卻傳回了以下的錯誤訊息:

System.Data.SqlServer.TruncationException: Trying to convert return value or output parameter of size 28726 bytes to a T-SQL type with a smaller size limit of 8000 bytes.

啥? SqlString只能被限制在8000 bytes的大小? 那麼SQL 2005的NVARCHAR(MAX)是在MAX心酸的嗎?

別激動! 其實只要加個小宣告SqlFacet(MaxSize=-1),問題就可以解決囉!

   1:  [Microsoft.SqlServer.Server.SqlFunction]
   2:  [return: SqlFacet(MaxSize = -1)]
   3:  public static SqlString DoSomething([SqlFacet(MaxSize = -1)] SqlString inpString)
   4:  {
   5:  if (compString.IsNull)
   6:      return SqlString.Null;
   7:  else
   8:      return new SqlString(
   9:          MyUtilClass.Blah(inpString.ToString())
  10:      );
  11:  }

 關於SqlFacet的說明,可以參考微軟的官方文件


Comments

# by hulu

被打敗了 還想說會不會有 SqlText 的類別~ :p 在應付極大量的資料,T-SQL與CLR的UDF效能比真的差得多~~

# by Jasper

不好意思,請問那一個效能較佳...

Post a comment