SQL2005 中使用UDF

For TSQL:

USE AdventureWorks;

GO

CREATE FUNCTION Sales.fn_SalesByStore (@storeid int)

RETURNS TABLE

AS

RETURN

(

    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'YTD Total'

    FROM Production.Product AS P

      JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID

      JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID

    WHERE SH.CustomerID = @storeid

    GROUP BY P.ProductID, P.Name

);

GO

 

 

For C#:

 

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, Environment.MachineName).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;

    }

}

 

You need to create the function in SQL by running these TSQL statement:

 

CREATE ASSEMBLY tvfEventLog

FROM'D:/assemblies/tvfEventLog/tvfeventlog.dll'

WITH PERMISSION_SET = UNSAFE

GO

CREATE FUNCTION ReadEventLog(@logname nvarchar(100))

RETURNS TABLE

(logTime datetime,Message nvarchar(4000),Category nvarchar(4000),InstanceId bigint)

AS

EXTERNAL NAME tvfEventLog.TabularEventLog.InitMethod

GO

 

And here is the example on how you can run your CLR functions:

 

-- select the top 100 events

SELECT TOP 100 *

FROM dbo.ReadEventLog(N'Security') as T

go

 

-- select the last 10 login events

SELECT TOP 10 T.logTime, T.Message, T.InstanceId

FROM dbo.ReadEventLog(N'Security') as T

WHERE T.Category = N'Logon/Logoff'

Go

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值