Tag: sqlclr

尝试发布SQL CLR数据库的日期时间类型不匹配

我试图站起来将一些.net函数发布到SQL Server数据库的旧解决方案。 但是,发布到新数据库的尝试在操作日期的函数上失败。 失败的function是: [SqlFunction(TableDefinition=”localtime datetime2″, IsDeterministic=true, IsPrecise=true, DataAccess=DataAccessKind.None, SystemDataAccess=SystemDataAccessKind.None)] public static DateTime ConvertFromUTC(DateTime utctime, string timezoneid) { if (utctime.Kind == DateTimeKind.Unspecified) utctime = DateTime.SpecifyKind( utctime, DateTimeKind.Utc ); utctime = utctime.ToUniversalTime(); return TimeZoneInfo.ConvertTimeBySystemTimeZoneId( utctime, timezoneid ); } 我尝试发布时收到的错误消息是: 创建[dbo]。[ConvertFromUTC] … (268,1):SQL72014:.Net SqlClient数据提供程序: 消息6551,级别16,状态2,过程ConvertFromUTC,第1行 “ConvertFromUTC”的CREATE FUNCTION失败,因为返回值的T-SQL和CLR类型不匹配。 (268,0):SQL72045:脚本执行错误 从.net生成的SQL,试图添加该函数: CREATE FUNCTION [dbo].[ConvertFromUTC] (@utctime DATETIME, @timezoneid NVARCHAR (MAX)) […]

基于.net ComputeHash的SQL CLRfunction不适用于Cyrrilic

我编写了以下SQL CLR函数,以便散列大于8000字节的字符串值( T-SQL内置HASHBYTES函数的输入值的限制): [SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)] public static SqlBinary HashBytes(SqlString algorithm, SqlString value) { HashAlgorithm algorithmType = HashAlgorithm.Create(algorithm.Value); if (algorithmType == null || value.IsNull) { return new SqlBinary(); } else { byte[] bytes = Encoding.UTF8.GetBytes(value.Value); return new SqlBinary(algorithmType.ComputeHash(bytes)); } } 它适用于拉丁字符串。 例如,以下哈希值是相同的: SELECT dbo.fn_Utils_GetHashBytes (‘MD5’, ‘test’); — 0x098F6BCD4621D373CADE4E832627B4F6 SELECT HASHBYTES (‘MD5’, ‘test’); […]

在T-SQL中处理来自CLR存储过程的多个结果

我有一些用C#编写的复杂算法作为CLR存储过程。 程序不是确定性的(取决于当前时间)。 程序的结果是两个表。 我没有找到任何解决方案如何处理T-SQL中存储过程的多结果。 这个过程的性能是关键(程序每隔约2秒调用一次)。 我发现更新表的最快方法是: UPDATE [db-table] SET … SELECT * FROM [clr-func] 它比通过ADO.NET从CLR过程更新db-table快得多。 我使用静态字段来存储结果,并在执行clr存储过程后查询它。 调用堆栈是: T-SQL proc -> CLR proc (MyStoredProcedure) -> T-SQL proc (UpdateDataFromMyStoredProcedure) -> CLR func (GetFirstResultOfMyStoredProcedure) -> CLR func (GetSecondResultOfMyStoredProcedure) 问题是,有时CLR函数在静态字段result空,但在CLR过程中result不为null。 我发现,有时CLR函数在另一个AppDomain中被调用而不是CLR过程。 但是,CLR过程仍在运行,可以执行下一个操作,不会抛出任何exception。 有没有办法,如何强制CLR函数在同一个AppDomain中作为“父”CLR程序调用? 或者是否有其他方式,如何实现我的意图? PS:最初复杂的算法是用T-SQL编写的,但性能很差(比C#中的算法慢约100倍)。 谢谢! 简化代码: // T-SQL CREATE PROC [dbo].[UpdateDataFromMyStoredProcedure] AS BEGIN UPDATE [dbo].[tblObject] SET … SELECT […]

将Process函数中的C#移动到SQL Server CLR函数

从进程C#代码迁移到SQL CLR函数有哪些限制,意外陷阱和性能特征? 我们目前有几个数据繁重的进程在进程C#Asp.net MVC项目中运行得非常快,而根本没有使用数据库。 表现非常重要。 应用程序使用静态内存缓存并执行复杂操作以获得最终结果。 缓存更新有点麻烦,我们正在考虑将其中一些进程转移到只输出最终结果的SQL Server查询,以便在c#app级别需要更少的数据缓存。 这些过程很复杂,我们知道迁移到数据库需要大量使用SQL Server CLRfunction。 我们在利用数据库方面看到了很多优势,但是由于以下几个原因,CLR函数的必要使用会暂停: 否Azure:Azure 不支持 SQL CLRfunction, 高测试成本: SQL CLRfunction可能更慢,测试将需要大量工作 小用户群:一小时的谷歌搜索显示,使用CLRfunction有点不常见,这使得社区支持(以及可能的MS支持)成为一个问题。 我很乐意听到有人将C#应用程序从进程中移动到CLRfunction。 在您的答案中,请假设需要自定义SQL CLR函数。

SQL Server CLR:如何在Visual Studio 2013数据库项目中的CLR SQL存储过程中调用WCF服务

我有Visual Studio 2013。 我创建了一个数据库项目。 我为该项目添加了一个CLR存储过程,我想从中调用一个WCF服务。 谁能帮我? 我希望能够在不更改程序集的情况下更改服务地址,类似于我在web.config使用我的WCF客户端配置的endpoint部分可以执行的操作。

CLR集成中的套接字通信

套接字通信在CLR集成中是否表现良好。 例如:我在CLR Integration中创建了一个PROC。它从表中获取所有数据,并且只想将数据发送到TCP服务器。 命令: CREATE ASSEMBLY TcpClr FROM ‘G:\TcpClrTest.dll’ WITH PERMISSION_SET = EXTERNAL_ACCESS GO CREATE PROCEDURE SendDataToSrv ( @NAME nvarchar(20) ) AS EXTERNAL NAME TcpClr.[TcpClrTest.TcpSend].SqlProce; GO EXEC SendDataToSrv ‘cdc.dbo_Test_CT’ TcpClrTest.dll中的一些代码: using (SqlCommand cmd = new SqlCommand(“SELECT * FROM tableName”, con)) { using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { //string value = reader[0].ToString(); //tcpClient.Write(value); […]

从Console App或SQLCLR对象调用函数时处理连接的最佳方法(“Context Connection = true”)

我的数据层中有以下类型的代码,可以从控制台应用程序,Windows应用程序等调用,并从相应的调用者的App.Config文件中读取正确的连接字符串: public static udsDataset GetDataset(int datasetID) { string connectionString = ConfigurationManager.ConnectionStrings[“ConnectionString”].ConnectionString; string sql = @”select * from Dataset WHERE DatasetID=@datasetID”; using (SqlConnection conn = new SqlConnection(connectionString)) { // Dapper query: return conn.Query(sql, new {datasetID } ).First(); } } 我现在想从SQLCLR存储过程(在存在这些表的数据库中)调用相同的代码,您通常使用上下文连接 : using(SqlConnection connection = new SqlConnection(“context connection=true”)) { connection.Open(); // etc etc etc } 想到的最明显的方法是重载函数: public […]

无法附加到SQL Server以调试SQLCLR存储过程

我想在SQL Server中调试SQLCLR存储过程。 我一直在尝试在VS2015社区和最近安装的VS2017社区版本中调试SP,但没有成功。 我很确定问题在于附加到SQL Server,但是我已经完成了我在网上提到的所有内容,但无济于事。 在SQL Server Express LocalDB中创建数据库项目时,一切正常。 如果我更改连接字符串以使用我的Developer Edition SQL Server,那么我会收到错误。 我做了以下事情: 我创建了一个新的数据库。 我是服务器的唯一用户,它驻留在我用于Visual Studio的同一桌面计算机上。 在Visual Studio中,我使用一种简单的方法创建了一个简单的数据库项目,以便将一些文本发送到输出管道。 [Microsoft.SqlServer.Server.SqlProcedure] public static void mytest () { SqlContext.Pipe.Send(“in clr Craig1”); } 我在项目属性中编辑了目标连接字符串以连接到新数据库,并在按下连接按钮时成功建立连接。 连接字符串为我使用Windows身份validation,使用与数据库所有者相同的用户。 我构建并部署了解决方案并检查了SQL对象资源管理器以确保部署了SP。 它是。 我选择了服务器,并使用右键单击选择“允许SQL / CLR调试”。 我再次检查它以确保它实际设置。 我选择了存储过程并右键单击,选择“Debug Procedure …” 显示了调试脚本。 我走到线上执行SP,然后按F11进入。此时我看到以下内容: 我按下附件并显示以下错误: 此后,该过程执行并执行管道function,但它不允许我进行附件和调试。 我做错了什么想法? 谢谢克雷格

如何为SQL CLR存储过程提供sql_variant参数?

如何将sql_variant参数添加到SQL CLR存储过程? 使用System.Object不起作用,我没有看到任何可以使用的属性。 [Microsoft.SqlServer.Server.SqlProcedure] public static void ClearOnePartition( SqlString aString , /* I want this to be a sql_variant */ object aVariant ) { //do stuff here }

DRY CLR表值函数

我正在使用CLR表值函数来SELECT并返回使用许多变量的复杂数据库搜索的结果。 文档显示您以类似于此的方式构建此类函数: public partial class UserDefinedFunctions { private class ResultRow // This class holds a row which we want to return. { public SqlInt32 CustId; public SqlString Name; public ResultRow(SqlInt32 custId_, SqlString name_) { CustId = custId_; Name = name_; } } [SqlFunction( DataAccess = DataAccessKind.Read, FillRowMethodName = “Test_FillRow”, TableDefinition = “CustId int” + “Name […]