понедельник, 15 июня 2009 г.

CLR функция для T-SQL которая возвращает таблицу

Код функции возвращающий таблицу как результат
Навеяно TSQL функцией которая строку вида '1,2,3,4,5' переворачивает в таблицу
НО! если строка большая, то начинаются дикие тормоза
Это решение подымает скорость!

=================================
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Collections.Generic;
public partial class UserDefinedFunctions
{
private class TableResult
{
public SqlString Element;
public TableResult(SqlString element)
{
Element = element;
}
}

[SqlFunction(TableDefinition = "Element nvarchar(max)",
DataAccess = DataAccessKind.Read,
FillRowMethodName = "FillRow")]
public static IEnumerable Function1(string p)
{
ArrayList resultCollection = new ArrayList();
var ss = p.Split(new[] { ',' });
foreach (var s in ss)
resultCollection.Add(new TableResult(s));
return resultCollection;

//resultCollection.AddRange
//return (new List(p.Split(new[] { ',' }))
//.ConvertAll(s => new TableResult(s)));
}

public static void FillRow(
object Obj,
out SqlString element)
{
TableResult result = (TableResult)Obj;
element = result.Element;
}

};
===========================================

Поднять все это в MSSQL
IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'SqlServerProject2')
DROP ASSEMBLY SqlServerProject2
go

CREATE ASSEMBLY SqlServerProject2 FROM 'C:\SqlServerProject2.dll'
WITH PERMISSION_SET = SAFE -- EXTERNAL_ACCESS
GO

CREATE FUNCTION [dbo].[Function1](@p [nvarchar](max))
RETURNS TABLE (
[Element] [nvarchar](max) NULL
) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SqlServerProject2].[UserDefinedFunctions].[Function1]
go

select * from dbo.Function1('234567,222,233,123');
go

Комментариев нет: