0

この以前のスタックオーバーフローの質問について:

DRY CLR テーブル値関数

シングルスレッドモードでしか動作しないようです。これをテストするために、コードを少し変更して、名前フィールドの先頭に現在のスレッド番号を追加しました。返されたすべての結果には、同じスレッド番号が割り当てられていました。このアクションは設計によるものですか? とにかくマルチスレッドにする方法はありますか?ありがとう。

private class ResultRow
// This class holds a row which we want to return.
{
    public SqlInt32 CustId;
    public SqlString Name;

    public ResultRow(SqlInt32 custId_, SqlString name_)
    {

        int mythread = Thread.CurrentThread.ManagedThreadId;
        CustId = custId_;
        Name = "[" + mythread.ToString() + "] " + name_;
    }
}

マークの質問ごとに編集:

これが完全なコードです。7 秒で 3470 レコードが返されます。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections.Generic;
using System.Collections;
using System.Threading;

namespace CS_CLR_TVF
{

  public partial class UserDefinedFunctions
  {

    // This class holds a row which we want to return.
    private class ResultRow
    {
        public SqlString fldProductName;
        public ResultRow(SqlString product_)
        {
            int mythread = Thread.CurrentThread.ManagedThreadId;
            fldProductName = "[" + mythread.ToString() + "] " + product_;
        }
    }

    [SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "Test_FillRow", TableDefinition = "fldProductName nvarchar(1024)")]
    public static IEnumerable xudf_cs_tvf(SqlString strSearchClue)
    {
        ArrayList results = new ArrayList();

        using (SqlConnection connection = new SqlConnection("context connection=true"))
        {
            connection.Open();
            string s1;

            using (SqlCommand select = new SqlCommand("SELECT fldProductName FROM tblProducts", connection))
            {
                using (SqlDataReader reader = select.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        s1 = reader.GetSqlString(0).ToString();

                        // do a substring compare, if "match" grab the row
                        int idx = s1.IndexOf(strSearchClue.ToString());
                        if (idx > -1) results.Add(new ResultRow(reader.GetSqlString(0)));
                    }
                }
            }
        }
        return results;
    }

    // This function takes a row and tells SQL Server what variables we want to 
    // return from it and what types it contains.
    public static void Test_FillRow(object resultsObj, out SqlString fldProductName)
    {
        ResultRow selectResults = (ResultRow)resultsObj;
        fldProductName = selectResults.fldProductName;
    }
  }
}

非常に単純な内部選択ステートメント:

SELECT fldProductName FROM tblProducts

. . . . これは、スカラー UDF として実装されたバージョンで、マルチスレッドを実行します。1 秒未満で 3470 レコードが返されます。

[Microsoft.SqlServer.Server.SqlFunction]
public static long xudf_csfake(SqlString strSearchClue, SqlString strStringtoSearch)
{
    string s1 = strStringtoSearch.ToString();
    // do a substring compare, if "match" grab the row
    int idx = s1.IndexOf(strSearchClue.ToString());
    if (idx > -1) return 1;

    return 0;
}  

これが外部選択ステートメントです。

SELECT  fldProductName FROM tblProducts  WHERE (dbo.xudf_csfake('METAL' ,fldProductName) = 1)

そのため、記事が示していることとは反対のことをしているようです。

4

0 に答える 0