1

CRL統合によってSQL関数を作成しようとしていますが、次のエラーが発生します。

戻り値のT-SQLタイプとCLRタイプが一致しないため、「GetWSClient」のCREATEFUNCTIONが失敗しました。

dllでWebServiceを使用し、それをSQLServerのアセンブリとして統合しようとしています。

私のC#コードは次のとおりです。

namespace InternalLists
{
    public class UserDefinedFunctions
    {

      [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read, Name = "WSClient", FillRowMethodName = "Fill_WSClient",
        TableDefinition = "Name nvarchar(255)")]
       public static DataSet WSClient(SqlString url, SqlString idClient)
       {
           WSInternalList.CLIENTS client = new WSInternalList.CLIENTS();
           client.Url = url.ToString();
           return client.WM_CLIENT(idClient.ToString());
       }

       public static void Fill_WSClient(object ProductObj, out SqlString Name)
       {
           DataRow row = (DataRow)ProductObj;
           Name = new SqlString(row["VWSDN_NAME"].ToString());
       }
    }
}

私のSQLコードは次のとおりです。

CREATE FUNCTION [dbo].[GetWSClient](@url nvarchar(255), @idClient nvarchar(255))
RETURNS  TABLE (
Name nvarchar(255) NULL
)
EXTERNAL NAME [InternalLists].[InternalLists.UserDefinedFunctions].[WSClient]
GO

私はこの答えを見ましたが、関数をDataSet戻り型として宣言しており、WSがDataSet結果を返していることを知っています。

だから、私は何を間違っているのですか?

4

2 に答える 2

2

CLRテーブル値関数を作成しています。http://msdn.microsoft.com/en-us/library/ms131103.aspxのドキュメントから、サンプルを次に示します。

using System;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Data.SqlTypes;
using System.Diagnostics;

public class TabularEventLog
{
    [SqlFunction(FillRowMethodName = "FillRow")]
    public static IEnumerable InitMethod(String logname)
    {
        return new EventLog(logname).Entries;
    }

    public static void FillRow(Object obj, out SqlDateTime timeWritten, out SqlChars message, out SqlChars category, out long instanceId)
    {
        EventLogEntry eventLogEntry = (EventLogEntry)obj;
        timeWritten = new SqlDateTime(eventLogEntry.TimeWritten);
        message = new SqlChars(eventLogEntry.Message);
        category = new SqlChars(eventLogEntry.Category);
        instanceId = eventLogEntry.InstanceId;
    }
}

IEnumerableまたはを返す必要がありますIEnumerable<T>。ランタイムはそれを列挙し、列挙されたIEnumerable各オブジェクトを(上記の例では最初の引数として)Fill Rowメソッドに渡し、Object objTDSを介してクライアントに送信できるものにマッピングします。クライアントは、それが何であるかに応じて、それを結果セットに変換します。

于 2012-08-14T19:17:00.550 に答える
1

T-SQLテーブルのデータ型は、DataSetデータ型と同じではありません。SQLCLRアセンブリ内のUDFはIEnumerable型を返す必要があり、DataSetはIEnumerableを実装していません。

関数を変換してIListSource.GetList()を返すことができる場合があります。これは、次のようにIEnumerableを実装します。

return ((IListSource)client.WM_CLIENT(idClient.ToString())).GetList();

標準的な警告が適用されます-テストされていません-しかし、おそらくそれはあなたに正しい方向へのプッシュを与えるでしょう。祝福!

于 2012-08-14T19:13:05.203 に答える