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
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-09 22:53:19