2012-08-14 90 views
1

我试图创建由CRL整合SQL函数,但我有以下错误:的CREATE FUNCTION <> T-SQL和CLR类型的返回值不匹配

CREATE FUNCTION for "GetWSClient" failed because T-SQL and CLR types for return value do not match.

我试图在我的dll中使用一个WebService,然后将它作为一个Assembly装入SQL Server中。

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

我见过this的答案,但我声明我的函数为数据集返回类型,而且我知道,我的WS正在返回一个DataSet结果。

那么,我在做什么错?

回答

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; 
    } 
} 

您需要返回IEnumerableIEnumerable<T>。运行时将负责枚举IEnumerable,将每个枚举对象传递给您的填充行方法(作为第一个参数,在上面的示例中为Object obj)并将其映射到可通过TDS向客户端喷射的东西,客户端根据其内容将其转换为结果集。

+0

谢谢,那正是问题所在,我正在返回一个DataSet,所以我需要将它转换为IEnumerable。 – Elwi 2012-08-14 19:51:06

1

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

你也许能够转换函数返回IListSource.GetList(),它不实现IEnumerable,是这样的:

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

标准告诫: - 未测试 - 但也许会给你一个推在正确的方向。祝福!

相关问题