Questions tagged «sql-clr»

SQL CLR是Microsoft针对SQL Server的Common-Language-Runtime实现。使用此标记可解决有关如何在Microsoft SQL Server上实现SQLCLR并对其进行故障排除的问题。

4
使用SQL CLR标量函数模拟HASHBYTES的可伸缩方法是什么?
作为ETL流程的一部分,我们将暂存中的行与报表数据库进行比较,以找出自从上次加载数据以来是否实际更改了任何列。 比较是基于表的唯一键和所有其他列的某种哈希值。我们目前使用HASHBYTES该SHA2_256算法,并且发现如果许多并发工作线程都在调用,则该算法无法在大型服务器上扩展HASHBYTES。 在96台核心服务器上进行测试时,以每秒哈希数衡量的吞吐量不会增加超过16个并发线程。我通过将并发MAXDOP 8查询数从1 更改为12进行测试。测试MAXDOP 1显示了相同的可伸缩性瓶颈。 作为一种解决方法,我想尝试一个SQL CLR解决方案。这是我尝试陈述要求的尝试: 该功能必须能够参与并行查询 函数必须是确定性的 该函数必须接受NVARCHAR或VARBINARY字符串的输入(所有相关列都串联在一起) 字符串的典型输入大小为100-20000个字符。20000不是最大值 哈希冲突的机会应大致等于或优于MD5算法。CHECKSUM对我们不起作用,因为有太多的碰撞。 该功能必须在大型服务器上很好地扩展(随着线程数量的增加,每个线程的吞吐量不应显着降低) 对于Application Reasons™,假定我无法保存报表的哈希值。这是一个不支持触发器或计算列的CCI(还有其他我不想讨论的问题)。 HASHBYTES使用SQL CLR函数进行仿真的可扩展方式是什么?我的目标可以表示为在大型服务器上每秒获得尽可能多的哈希,因此性能也很重要。我对CLR感到很糟糕,所以我不知道该如何完成。如果它激励任何人回答,我计划在可能的情况下尽快为这个问题添加赏金。下面是一个示例查询,它非常粗略地说明了用例: DROP TABLE IF EXISTS #CHANGED_IDS; SELECT stg.ID INTO #CHANGED_IDS FROM ( SELECT ID, CAST( HASHBYTES ('SHA2_256', CAST(FK1 AS NVARCHAR(19)) + CAST(FK2 AS NVARCHAR(19)) + CAST(FK3 AS NVARCHAR(19)) + CAST(FK4 AS NVARCHAR(19)) + …

3
为其他数据库中的内部存储过程使用中央CLR存储过程/函数存储库来使用?
我想使用我在C#CLR中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库设置为可信任并打开CLR并在每个数据库中保留一堆相同的代码。 从管理和安全的角度来看,有没有最佳方法?CLR功能是非常基本的功能,例如字符串分隔符,电子邮件验证,URL编码/解码,base64等。我希望每个数据库中只有dbo模式才能访问这些功能。 有没有简单的方法可以做到这一点? 另外我也不清楚CLR dll是否被嵌入,是否移动数据库,是否带有标签,或者是否也必须移动dll。 谢谢

3
SQL Server CLR中的第三方dll
我需要在SQL Server CLR的触发器c#代码中使用第三方DLL 但是,当我尝试添加引用时,它仅显示了SQL Server中的一些DLL。 如何将第三方dll添加到SQL Server?
14 sql-server  c#  sql-clr 


2
在SQL Server 2014上崩溃CLR(Windows 2012R2)
我有这个小的CLR,它对列中的字符串执行RegEX功能。 在Windows Server 2012R2的SQL Server 2014(12.0.2000)上运行时,该进程崩溃 消息0,级别11,状态0,行0当前命令发生严重错误。结果(如有)应丢弃。 并给我一个堆栈转储 select count (*) from table where (CLRREGEX,'Regex') 但是当我这样做 select * from table where (CLRREGEX,'Regex') 它返回行。 可以在Windows 8.1上运行的同一SQL Server版本上完美运行。 有任何想法吗? -编辑尽可能简单 using System; using System.Collections.Generic; using System.Text; using System.Data.SqlTypes; //SqlString, SqlInt32, SqlBoolean using System.Text.RegularExpressions; //Match, Regex using Microsoft.SqlServer.Server; //SqlFunctionAttribute public partial class UserDefinedFunctions …

2
存储IP地址-varchar(45)与varbinary(16)
我要创建一个表有两个领域- ID作为BIGINT和IPAddress作为两种varchar(45)或varbinary(16)。想法是存储所有唯一的IP地址,并使用引用ID代替IP address其他表中的实际IP 。 通常,我将创建一个存储过程,该存储过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID。 我期望有很多记录(我无法确切知道有多少条记录),但是我需要上面的存储过程尽快执行。因此,我想知道如何以文本或字节格式存储实际的IP地址。哪个会更好? 我已经编写SQL CLR了将IP地址字节转换为字符串和反向的函数,因此转换不是问题(使用IPv4和都可以IPv6)。 我想我需要创建一个索引来优化搜索,但是我不确定是否应该将该IP address字段包括在聚集索引中,还是要创建一个单独的索引,并且使用哪种类型的搜索会更快?




1
显然,我的CLR汇编函数引起了死锁?
我们的应用程序需要与Oracle数据库或Microsoft SQL Server数据库同样良好地工作。为方便起见,我们创建了一些UDF以使查询语法同质。例如,SQL Server具有GETDATE(),而Oracle具有SYSDATE。它们执行相同的功能,但它们是不同的词。我们为两个平台编写了一个名为NOW()的包装UDF,该包装将相关的平台特定语法包装在一个通用函数名称中。我们还有其他这样的功能,其中一些功能实际上什么也不做,只是为了同质化而存在。不幸的是,这对于SQL Server是有成本的。内联标量UDF严重破坏性能,并完全禁用并行性。作为替代方案,我们编写了CLR汇编函数以实现相同的目标。当我们将其部署到客户端时,他们开始遇到频繁的死锁。这个特定的客户端正在使用复制和高可用性技术,我想知道这里是否存在某种交互。我只是不了解引入CLR函数将如何导致这样的问题。作为参考,我在C#中包含了原始的标量UDF定义以及替换的CLR定义,并为其提供了SQL声明。如果有帮助,我也可以提供死锁XML。 原始UDF CREATE FUNCTION [fn].[APAD] ( @Value VARCHAR(4000) , @tablename VARCHAR(4000) = NULL , @columnname VARCHAR(4000) = NULL ) RETURNS VARCHAR(4000) WITH SCHEMABINDING AS BEGIN RETURN LTRIM(RTRIM(@Value)) END GO CLR组装功能 [SqlFunction(IsDeterministic = true)] public static string APAD(string value, string tableName, string columnName) { return value?.Trim(); } …

2
层次结构CLR是开源的吗?
内置的architectureid是CLR,它以有效的二进制形式存储路径,并提供其他有用的功能。 不幸的是,表示路径的深度是有限的,对于一棵二叉树来说大约是1427。我想为必然要达到此限制的复杂的现有应用程序增加该限制。我不想更改类型的界面。我不相信我可以开始更改类型的接口,而不会在所有必须更改的代码中引入细微的错误。 从理论上讲,我可以创建一个“ binhierarchyid” CLR UDT,它实现与hierarchicalid相同的接口,但仅支持二进制树。那应该使我的深度达到〜7000,同时仍保持在900字节的限制之内。不确定这项工作有多大。 是否可以在任何地方找到该architearchid CLR的来源,以便我可以基于它创建更深层次的结构呢?

1
dm_exec_describe_first_result_set_for_object用于多个结果集
是否存在用于返回存储过程中所有结果集的元数据的过程? 类似于sys.dm_exec_describe_first_result_set_for_object,但适用于所有结果集? 最终,我将要发现数据库中每个存储过程中每个结果集的元数据。现在,我将只解决sys.dm_exec_describe_first_result_set_for_object无法描述的结果集。即,第二,第三和第N个结果集。 现在考虑使用SQLCLR来执行此操作: 如何保存具有多个结果集tSQLt 的过程的结果 -SQL Server的数据库单元测试-ResultSetFilter.cs

3
程序集'system.web,版本= 4.0.0.0,文化=中性,publickeytoken = b03f5f7f11d50a3a'。在SQL目录中找不到
我正在尝试使用System.Web的HTTPUtility.UrlDecode方法部署SQL CLR函数,但是无法部署它。收到错误: .Net SqlClient数据提供程序:消息6503,级别16,状态12,行1程序集'system.web,version = 4.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a。' 在SQL目录中找不到。 功能(作为SSDT项目的一部分): using System; using System.Web; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)] public static SqlString udf_UrlDecode(SqlString encodedXML) { string decodedXML; decodedXML = HttpUtility.UrlDecode(encodedXML.ToString()); return new SqlString(decodedXML); } } 与这个线程有关。我是带有VS2012 SSDT和数据库项目的SQL …

1
sqlproj中的参考程序集未部署到服务器
我有一个Visual Studio 2013数据库项目这需要一个修改版本的FASTJSON作为参考。我在参考属性中选择了Generate DDL,如以下屏幕截图所示: 在.sqlproj msbuild文件中: <Reference Include="fastJSON"> <HintPath>..\..\fastjson\output\net40\fastJSON.dll</HintPath> <GenerateSqlClrDdl>True</GenerateSqlClrDdl> </Reference> 但是bin / debug / Project.sql不包含的行CREATE ASSEMBLY fastJSON . . .。手动添加程序集有效,然后我的项目将部署并运行。如何使Visual Studio部署我的程序集?

1
了解MS SQL Server日期类型
考虑以下: declare @dt datetime, @dt2 datetime2, @d date set @dt = '2013-01-01' set @dt2 = '2013-01-01' set @d = '2013-01-01' select convert(varbinary, @dt) as dt, convert(varbinary, @dt2) as dt2, convert(varbinary, @d) as d 输出: dt dt2 d ------------------ -------------------- -------- 0x0000A13900000000 0x07000000000094360B 0x94360B 现在,我已经从理解的文件是datetime有一个较小的范围,并开始从1753年1月1日,而datetime2与date使用0001-01-01作为他们的开始日期。 我不明白不过,是datetime似乎是小端,而datetime2和date是大端。如果是这样,它们怎么能正确分类? 考虑一下我是否想知道一个date类型代表多少整数天。您会认为您可以这样做: declare @d date set …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.