1. 创建项目:
2. 添加函数代码:
using System;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
using System.Collections;
using System.Data.SqlTypes;
using System.Diagnostics;
public class TabularEventLog
{
[SqlFunction(TableDefinition =
@"logTime datetime
,Message nvarchar(4000)
,Category nvarchar(4000)
,InstanceId bigint",
Name = "ReadEventLog", 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;
}
}
3. 脚本:
USE MASTER
GO
sp_configure 'show advanced options',1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
--表值函数放在 db_study 库上
USE db_study
GO
--删除函数
IF OBJECT_ID('[dbo].[ReadEventLog]') IS NOT NULL
DROP FUNCTION [dbo].ReadEventLog
GO
--删除程序集
IF EXISTS(SELECT * FROM SYS.ASSEMBLIES WHERE NAME='tvfEventLog')
DROP ASSEMBLY tvfEventLog
GO
--创建程序集, 设置为实际路径, 注意应设置为: UNSAFE
CREATE ASSEMBLY tvfEventLog FROM'D:\Project\StudySimple\SqlServerProject1\bin\Debug\SqlServerProject1.dll' WITH PERMISSION_SET = UNSAFE
GO
--创建表值函数
CREATE FUNCTION dbo.ReadEventLog(@logname nvarchar(100))
RETURNS TABLE (
logTime DATETIME
,Message nvarchar(4000)
,Category nvarchar(4000)
,InstanceId BIGINT
)
AS
EXTERNAL NAME tvfEventLog.TabularEventLog.InitMethod
GO
--查询
SELECT TOP 10 T.logTime, T.Message, T.InstanceId
FROM dbo.ReadEventLog(N'Security') as T
ORDER BY logTime DESC
参考:http://www.microsoft.com/china/msdn/library/data/sqlserver/bb293147.mspx?mfr=true
此页面做法有问题: https://msdn.microsoft.com/zh-cn/library/ms131103(v=sql.120).aspx