C# 为<&燃气轮机;返回值的T-SQL和CLR类型不匹配

C# 为<&燃气轮机;返回值的T-SQL和CLR类型不匹配,c#,sql,tsql,sqlclr,sql-types,C#,Sql,Tsql,Sqlclr,Sql Types,我试图通过CRL集成创建SQL函数,但出现以下错误: “GetWSClient”的创建函数失败,因为返回值的T-SQL和CLR类型不匹配 我正在尝试使用dll中的Web服务,然后在SQL Server中将其集成为程序集 我的C#代码是: 我的SQL代码是: CREATE FUNCTION [dbo].[GetWSClient](@url nvarchar(255), @idClient nvarchar(255)) RETURNS TABLE ( Name nvarchar(255) NULL

我试图通过CRL集成创建SQL函数,但出现以下错误:

“GetWSClient”的创建函数失败,因为返回值的T-SQL和CLR类型不匹配

我正在尝试使用dll中的Web服务,然后在SQL Server中将其集成为程序集

我的C#代码是:

我的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结果


那么,我做错了什么??

T-SQL表数据类型与数据集数据类型不同。SQLCLR程序集中的UDF需要返回IEnumerable类型,而DataSet不实现IEnumerable

您可以将函数转换为返回IListSource.GetList(),该函数实现IEnumerable,类似于:

return ((IListSource)client.WM_CLIENT(idClient.ToString())).GetList();
标准警告适用-未经测试-但这可能会给你一个正确的方向推动。祝福

您正在创建一个CLR表值函数。从的文档中,以下是一个示例:

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
。运行时将负责枚举该
IEnumerable
,将每个枚举对象传递给Fill Row方法(作为上例中的第一个参数,
object obj
),并负责将其映射为可以通过TDS向下喷射到客户端的内容,其中客户端根据它是什么,将其转换为结果集。

谢谢,这正是问题所在,我正在返回一个数据集,因此需要将其转换为IEnumerable。
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;
    }
}