Tag: sqlclr

SQL CLR触发器,如何通过透明代码调用关键代码使程序集受信任?

我已经潜入研究SQL CLR。 不幸的是,我的第一个例子有透明代码调用安全代码的问题 。 重点是我的SQL CLR触发器被视为透明代码。 在触发器中,我使用Quartz来调用Quartz Windows服务: var properties = new NameValueCollection(); properties[“quartz.scheduler.instanceName”] = “ServerScheduler”; properties[“quartz.scheduler.proxy”] = “true”; properties[“quartz.scheduler.proxy.address”] = string.Format(“tcp://{0}:{1}/{2}”, “localhost”, “555”, “QuartzScheduler”); var schedulerFactory = new StdSchedulerFactory(properties); IScheduler scheduler = schedulerFactory.GetScheduler(); 错误: (135,1):SQL72014:.Net SqlClient数据提供程序:消息6522,级别16,状态1,过程AfterMarketSessionInserted,第1行在执行用户定义的例程或聚合“AfterMarketSessionInserted”期间发生.NET Framework错误:System.MethodAccessException : 尝试通过安全透明方法 ‘.Database.Triggers.MarketSessionTriggers.AfterMarketSessionInserted()’ 访问安全关键方法 ‘Quartz.Impl.StdSchedulerFactory..ctor(System.Collections.Specialized.NameValueCollection)’ 失败。 Assembly’Database,Version = 1.0.5275.15169,Culture = neutral,PublicKeyToken = null’部分受信任,这导致CLR使其完全安全透明,而不管程序集本身是否有任何透明度注释。 为了访问安全关键代码,必须完全信任此程序集。 System.MethodAccessException:at Database.Triggers.FinancialMarketSessionTriggers.AfterFinancialMarketSessionInserted() ————– […]

将表作为参数传递给SQLCLR TV-UDF

我们有一个第三方DLL可以在DataTable上运行源信息并生成一些有用的值,我们试图通过SQLCLR将其连接起来,以便在SQL Server 2008中作为表值UDF进行调用。 将这个概念更进一步,我想编写一个CLR表值函数 ,它对来自DB的源数据表进行操作。 我很确定我理解在T-SQL方面需要做些什么; 但是, .NET(C#)代码中的方法签名应该是什么样的? “来自SQL Server的表数据?”的参数数据类型是什么? 例如 /* Setup */ CREATE TYPE InTableType AS TABLE (LocationName VARCHAR(50), Lat FLOAT, Lon FLOAT) GO CREATE TYPE OutTableType AS TABLE (LocationName VARCHAR(50), NeighborName VARCHAR(50), Distance FLOAT) GO CREATE ASSEMBLY myCLRAssembly FROM ‘D:\assemblies\myCLR_UDFs.dll’ WITH PERMISSION_SET = EXTERNAL_ACCESS GO CREATE FUNCTION GetDistances(@locations InTableType) RETURNS OutTableType AS […]

在数据库上创建程序集时,部署SQL CLR项目失败

我在服务器上的文件夹中有一个包含3个dll文件的文件夹,用于创建程序集。 我首先尝试了以下代码并得到一个错误,说它无法在服务器上找到system.data.datasetextensions.dll文件,我将dll从我的计算机复制并粘贴到我的clr项目所在的同一文件夹中并尝试再次运行该命令。 Create Assembly OoplesCLR from ‘c:\ooplesclr\OoplesFinanceCLR.dll’ with Permission_set = SAFE GO 将dll从我的计算机复制到服务器文件夹后,我现在收到此错误 Warning: The Microsoft .NET Framework assembly ‘system.data.datasetextensions, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.’ you are registering is not fully tested in the SQL Server hosted environment and is not supported. In the future, if you upgrade or service this assembly or the .NET Framework, your […]

SQLCLR项目中的SqlDecimal问题

使用SqlDecimals时,我有一些意想不到的结果。 最后,当划分2个SqlDecimal时,似乎可以归结为缩放问题。 c#示例代码如下所示: [Microsoft.SqlServer.Server.SqlFunction] [return: SqlFacet(Precision = 38, Scale = 8)] public static SqlDecimal fn_divide([SqlFacet(Precision = 38, Scale = 8)]SqlDecimal x, [SqlFacet(Precision = 38, Scale = 8)]SqlDecimal y) { var r = SqlDecimal.Divide(@x, @y); return r; } SQL测试代码如下所示: DECLARE @x numeric(38, 8), @y numeric(38, 8) SELECT @x = Replicate(‘1’, 28) + ‘.12345678’, @y = ‘0.25896314’ […]

用于事件驱动通信的SQL CLR

在我工作的地方,他们使用长轮询技术来检测数据库中发生的事件。 虽然它有效…我想每个人都会同意轮询数据库不是最佳的。 我宁愿尝试某种推送技术或技术。 因此,我正在考虑使用表触发器来调用SQL CLR对象,该对象将事件放入队列或调用Web服务。 有很多关于如何做到这一点的例子: 从SQL CLR调用Web服务? 如何从SQL Server存储过程调用Web服务 在CLR集成中使用Webservices和Xml序列化 但是,我有点担心这样做的智慧和表现。 所以我的问题是: 长时间运行的触发器进程是否可以阻止原始INSERT完成? 失败的触发器进程是否会阻止原始INSERT完成? TRIGGERS是否在他们自己的线程上运行? 这是愚蠢的尝试还是有更好的选择?

SQL Server 2008 R2的C#CLR中的newtonsoft.json解析器 – 如何部署?

我创建了一个使用newtonsoft json parser.的CLR newtonsoft json parser. 我需要部署CLR 。 我为解析器依赖创建了一个程序集: CREATE ASSEMBLY [Newtonsoft.Json] FROM ‘C:\share\Release\Newtonsoft.Json.dll’ WITH PERMISSION_SET = UNSAFE 上面的语句抛出一个错误: `Assembly ‘Newtonsoft.Json’ references assembly ‘system.runtime.serialization, version=3.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.’, which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, […]

T-SQL(varchar(max)vs CLR(string,SqlString,SqlChars)?

我有一个问题,我无法解决。 我正在使用SQL Server 2005,C#CLR来使用外部dll。 问题在于参数的长度。 我需要使用函数参数类型varchar(max) 。 如果在C#代码中我使用string , SqlSring ,我不能使用T-SQL类型varchar(max) ,只能使用nvarchar(4000) varchar(4000) nvarchar(4000) 。 我需要说的是,当我需要使用超过4000个符号时,可能会出现这种情况,所以我需要知道,我需要使用哪种C#类型的varchar(max) 。 我已经阅读了很多文章,其中有几篇说,为此我可以使用SqlChars 。 但! 我有字符串操作。 如何使用string或SqlString进行操作然后转换为SqlChars ? (可能是SqlChars.ToString()或SqlChars.ToSqlString() )。 我没有找到任何C#代码。

具有多个参数的SQLCLR自定义聚合

我无法理解CLR用户定义的聚合如何工作。 我必须创建一些具有多个参数的自定义CLR聚合。 关键是要根据第二个参数得到第一个参数的值。 例如,我的表中有以下值,我需要每个Type的最旧员工Name : Type | Name | Age ——————————– Manager | emp 1 | 35 Manager | emp 2 | 42 Developer | emp 3 | 36 Developer | emp 4 | 45 Developer | emp 5 | 22 所以我想写这样的查询来通过使用我的程序集得到结果: Select Type, dbo.fOldestEmployee(Name, Age) AS [Name] From xxx Group By Type 这会回应: Type […]

具有多个sql_variant参数的SQLCLR自定义聚合

HY, 几个月前我在这篇文章中发布了一个关于CLR User-Defined Aggregates的问题。 这就像一个魅力。 但是现在我想在sql_variant类型中使用两个参数完全相同的函数。 就像在我上一篇文章中一样,这两个函数将是sMax和sMin,并将根据第二个函数返回第一个值。 我发现sql_variant类型是C#中的对象类型。 但我很难积累和比较对象。 在不知道类型的情况下比较这两个对象的最佳选择是什么?

.NET Regex整个字符串匹配

如果我们采用以下模式:70000 @。*和970000 @。*字符串970000@ILoveFishSticksAndTarTarSauce.com:5060将匹配返回到70000 @。* 我理解为什么它匹配,但我需要修改正则表达式只进行完整的字符串匹配。 有任何想法吗? 谢谢! 我正在使用.Net 3.5库 这是代码: [Microsoft.SqlServer.Server.SqlProcedure] public static void RouteRegex(string phoneNumber, out string value) { if (string.IsNullOrEmpty(phoneNumber)) { value = string.Empty; return; } const string strCommand = “Select RouteID,sequence,Pattern From SIPProxyConfiguration.dbo.Routes order by routeid, sequence asc”; using (var connection = new SqlConnection(“context connection=true”)) { try { connection.Open(); using (var command […]