Tag: sqlclr

SQL CLR等待不执行

我的理解是,当等待从等待返回时,等待完成执行代码的剩余部分。 我试图让它在sql clr中工作,并且这不能用作等待的进程和它下面的代码没有被执行。 在debug方法中,控件只在执行await行后返回。 我怎样才能完成这项工作,因为要求clr在不阻塞主线程的情况下执行,以便其他工作可以在db中继续运行。 我真的需要这个工作,现在已经有2天了。 NB如果方法是同步的,这很有效。 并且存储的proc程序集在sql server中注册为不安全。 我正在使用mssql 2012和visual studio 2015。 public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static async void sp_push_stock_update(SqlString transactionPrimaryKey, SqlString transactionType) { using (SqlConnection conn = new SqlConnection(“context connection=true”)) { StockUpdateClient.stock_fetcher _stockFetcher = new StockUpdateClient.stock_fetcher(conn); List skuList = await new System.Threading.Tasks.Task<List>(()=> _stockFetcher.getItems(transactionPrimaryKey, transactionType)); //Code does not get here performLogging(skuList): […]

SQLCLR和DateTime2

使用SQL Server 2008,Visual Studio 2005,.net 2.0 with SP2(支持新的SQL Server 2008数据类型)。 我正在尝试编写一个SQLCLR函数,它将DateTime2作为输入并返回另一个DateTime2。 例如: using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; namespace MyCompany.SQLCLR { public class DateTimeHelpCLR { [SqlFunction(DataAccess = DataAccessKind.None)] public static SqlDateTime UTCToLocalDT(SqlDateTime val) { if (val.IsNull) return SqlDateTime.Null; TimeZone tz = System.TimeZone.CurrentTimeZone; DateTime res = tz.ToLocalTime(val.Value); return new SqlDateTime(res); } } } 现在,上面的编译很好。 我希望这些SqlDateTimes映射到SQL Server的DateTime2,所以我尝试运行这个T-SQL: […]

SQL Server CLR UDF Parallelism redux

我一直在研究SQL Server CLR UDF和并行性。 普遍的共识似乎是在SQL Server 2008及更高版本中,带有DataAccessKind.None的标量值CLR UDF应该允许并行执行。 但是,当我在SQL Server 2012的视图中使用我的标量值UDF时,它仍然会杀死连接中的并行执行等。 有什么特别的东西需要添加到我的C#代码或T-SQL UDF定义中,以表明它对于并行执行是安全的吗? 谢谢。

名称空间“System.Data”中不存在类型或命名空间名称“DataSetExtensions”(您是否缺少程序集引用?)

我知道这是一个常见错误,但我对项目中添加的System.Data.DataSetExtensions.dll有正确的引用,我的项目是为.net 4.5构建的SQL CLR项目,我在下一行收到错误: using System.Data.DataSetExtensions; 我还检查了dll的属性,它引用了4.5 dll的正确版本,那么还有什么可能导致这个问题呢? 这是SQL CLR项目的问题吗?

从SQL Server 2012或SQL CLR C#发送HTTP POST请求

是否有一种普遍接受的标准方式从SQL Server 2012发送HTTP请求? 我想要做的是使用远程服务器处理搜索查询,然后将结果插回到SQL Server 2012数据库。 远程服务器提供了一个web api,它接受带有JSON内容的POST请求。 我有一个有效的解决方案,但需要将多个程序集加载到SQL Server中。 其中一些程序集不完全受支持(例如System.Net.Http.dll),发出如下警告: 警告:Microsoft .NET Framework程序集“system.net.http,version = 4.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a,processorarchitecture = msil。” 您正在注册未在SQL Server托管环境中进行全面测试,并且不受支持。 将来,如果升级或维护此程序集或.NET Framework,则CLR集成例程可能会停止工作。 有关更多详细信息,请参阅SQL Server联机丛书。 我想知道是否有更好/更安全的方式不需要加载所有这些组件? 我的存储过程的CLR代码: [Microsoft.SqlServer.Server.SqlProcedure] public static void SendSearchRequestProcedure (string query, string table) { RunAsync(query,table).Wait(); } static async Task RunAsync(string query, string table) { using (var client = new […]

从SQL CLR调用Web服务?

我有一个返回表的SQL Server 2012存储过程。 我必须修改该SP以向返回的表添加其他值。 不幸的是,这种附加值来自对Web服务的调用。 从我的研究中,我收集的主要方法是在SQL中使用OLE自动化程序(sp_OA …),或者使用SQLCLR存储过程。 给定sp_OA …过程运行的安全上下文,单个返回值是VARCHAR(10)注册密钥,并且对服务的调用很少(每小时10到20个),我猜测SQLCLR方法是要走的路。 此外,Web服务托管在我们的Intranet上,外部世界无法访问。 有没有更好的方法来完成我需要的东西? 更好的意思是更高性能,更好的安全性,更容易编码和维护

SQL Server CLR线程

我一直在努力使用SQL Server CLR存储过程。 背景: 我们正在使用SQL Server 2014,并且已经实现了一个调用客户Web服务的CLR存储过程。 最初使用线程不会减慢SQL Server CLR的主线程。 虽然,现在,我知道在CLR下使用线程并不是最好的主意,但它已经正常工作了6年(自SQL Server 2008以来)。 它最近已迁移到SQL Server 2014。 问题 在我的开发机器上,与测试系统一样,我们对解决方案没有任何问题。 在客户系统上,调用Web服务的线程由于某种原因从不执行。 我可以从日志文件中看到一切正常,直到线程执行。 没有特定的错误,没有。 我们一直在尝试更改权限,但没有成功。 因此,我认为这不是一个许可问题。 问题 有谁知道如何改变这种行为? 我们找不到任何可能起作用的配置。 完全删除线程,并直接在SQL Server主线程上调用Web服务是不是一个好主意? 谢谢你的任何建议,彼得

Sql Server CLR加载程序集失败

我正在尝试部署CLR TVF(表值函数)。 在代码中我使用JavaScriptSerializer来解析一些JSON字符串,所以我引用了System.Web.Extensions dll,我的问题从那里开始。 项目构建正常,但当我尝试注册该DLL时,我收到以下错误: 程序集“my_assembly_name”引用程序集“system.web.extensions,version = 4.0.0.0,culture = neutral,publickeytoken = 31bf3856ad364e35。”,这在当前数据库中不存在。 SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件。))。 请将引用的程序集加载到当前数据库中,然后重试您的请求。 我从以下url引用了system.web.extensions: C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ System.Web.Extensions.dll 我可以将copy load设置为true或手动复制程序集,但随后引用错误会更深入 – 程序集“my_assembly_name”引用程序集“system.servicemodel.activation,version = 4.0.0.0,culture = neutral,publickeytoken = 31bf3856ad364e35。”,它在当前数据库中不存在。 SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件。))。 请将引用的程序集加载到当前数据库中,然后重试您的请求。 一切正常,直到我引用Web.Extensions.dll。 目标框架是.NET 4。 任何想法/解决方案?

从SQL Server 2005中提取.NET程序集

我正在尝试帮助个人朋友(现在也是客户)与SQL CLR相关的问题。 他有一个SQL Server,其数据库中嵌入了3个.NET程序集。 他让我帮他从数据库中提取程序集并将它们保存为磁盘上的.dll文件。 这有可能吗?

SQL CLR Web服务调用:限制开销

我正在尝试提高应用程序的查询性能,而且我在逻辑上陷入困境。 因此应用程序是专有的,因此我们无法改变应用程序端代码。 但是,我们已获得使用底层数据库的许可(令人惊讶的是)。 应用程序调用SQL Server数据库,因此我们运行的当前想法是创建一个与表名相同的视图并重命名基础表。 当应用程序访问视图时,视图会调用两个SQL CLR函数之一,这两个函数除了调用我们放在一起的Web服务之外什么都不做。 Web服务执行所有逻辑,并包含对外部专有API的API调用,该API执行一些额外的逻辑,然后返回结果。 这一切都有效,但是,在扩展到大型数据集(100,000多行)时,我们遇到了严重的性能问题。 非常清楚的一个原因是我们不得不一次使用Web服务在一行上工作,其中包括API调用,这会产生大量的延迟开销。 对此明显的解决方案是找出一种方法来限制每个查询必须命中Web服务的次数,但这就是我被困住的地方。 我已经阅读了有关这种潜在处理方案的几种不同方法,但作为一个总数据库新手,我很难掌握在这种情况下适合的情况。 如果有任何想法/建议,我会非常感激。