标签: sql-clr

我可以从纯 T-SQL 调用 SMO 吗?

我知道如何使用 PowerShell 和 SMO 编写存储过程脚本:

[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")  | out-null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" 
$srv.databases['MyDatabase'].StoredProcedures['MyProc'].TextBody
Run Code Online (Sandbox Code Playgroud)

但由于我想在查询中使用过程文本,我想知道是否可以在纯 T-SQL 中以某种方式调用 SMO。

只能在开发环境中运行。

顺便说一句:返回具有给定名称的存储过程定义的函数可以解决我当前的问题,但不能回答我的问题。

编辑:

当我使用这个查询时,我想找到哪些过程引用了给定的表:

SELECT p.name --, definition 
FROM sys.sql_modules m
join sys.objects p on m.object_id = p.object_id
where p.type = 'P'
and definition like '%SearchForThis%'
Run Code Online (Sandbox Code Playgroud)

这与我想使用 SMO 获得的信息完全相同。

sql-server-2008 stored-procedures scripting sql-clr ole-automation

6
推荐指数
1
解决办法
1906
查看次数

禁用“CLR”时,“HierarchyID”类型如何工作?

以下语句sp_configure 'clr enabled'返回:

name        minimum maximum config_value    run_value
clr enabled 0       1       0               0
Run Code Online (Sandbox Code Playgroud)

我认为这意味着没有CLR对象;但是,如果我执行以下语句,我会得到这些:

SELECT * FROM sys.assembly_files
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

SELECT * FROM sys.assembly_types
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我已经读过The HierarchyID type is available to CLR clients as the SqlHierarchyId data type.

如何在没有CLR启用的情况下使用它,为什么我需要启用它来创建我自己的CLR对象?

sql-server configuration sql-server-2012 sql-clr

6
推荐指数
1
解决办法
459
查看次数

.NET SQLCLR 程序集在 SQL Server 2016 中不起作用(错误消息 10314)

我正在将数据库应用程序从 Windows 2008 R2/SQL Server 2008 R2 迁移到使用第三方 .NET CLR 程序集来解析字符串的 Windows 2012 R2/SQL Server 2016。

我得到的错误是:

尝试加载程序集 ID 65540 时 Microsoft .NET Framework 中发生错误。服务器可能资源不足,或者程序集可能不受 PERMISSION_SET = EXTERNAL_ACCESS 或 UNSAFE 的信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的更多信息:
System.IO.FileLoadException: 无法加载文件或程序集“clrsplit,版本=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全相关的错误。(来自 HRESULT 的异常:0x8013150A)

System.IO.FileLoadException: 在 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean SuppressSecurityChecks. (AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean SuppressSecurityChecks) 在 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblyMarkSecurity, StackIndPrrawlPrawl for …

sql-server sql-clr sql-server-2016

6
推荐指数
1
解决办法
2万
查看次数

SQL Server CLR 过程和 SQLCLR_QUANTUM_PUNISHMENT

我有一个在 SQL Server 2014 上运行的 CLR 存储过程。这个存储过程收集一些数据(通常在数万行范围内编号),对数据运行一些计算,生成一个输出数据集,并写入该输出数据集到几个目标表。对于小型运行,这需要几秒钟。对于我们较大的运行,目前大约需要 25 分钟。在这 25 分钟内,我们观察到大量 SQLCLR_QUANTUM_PUNISHMENT 等待。所以我试图让自己了解我们可以做些什么来减少这些等待的发生。我发现大量资源告诉我,“当 CLR 任务因超出其执行量而受到限制时发生。这种限制是为了减少此资源密集型任务对其他任务的影响。” 和我' 已经读过 SQL Server 的执行时间为 4 毫秒。那么我是否可以假设任何时候 CLR 存储过程或函数占用超过 4 毫秒的 CPU 时间,都会发生这种等待类型?

另外,我找到了一个参考资料,指出某些 CLR 过程应该产生. 现在,我们的 CLR 过程是单线程的。我当然可以在关键位置添加一些睡眠调用,看看会产生什么样的影响。但我想更好地了解正在发生的事情。因此,如果有人有一些好的知识可以分享或有一个好的文档/文章的链接,我将不胜感激。在 BOL 引用之外查找有关此等待类型的信息有点困难。

sql-server wait-types sql-clr sql-server-2014

6
推荐指数
1
解决办法
545
查看次数

我们可以从 SQL Server 中的 .NET 程序集调用哪些类型的方法

在 SQL Server 中注册 DLL 后(在 Programmability -> Assemblies 中),我们可以从 SQL Server 中的 .NET 程序集中调用任何类型的方法吗?还是只是静态的?

sql-server sql-clr

6
推荐指数
1
解决办法
604
查看次数

为什么我在家工作时会使用 tSQLt 获得 PREEMPTIVE_OS_AUTHORIZATIONOPS?

我有一个包含 tSQLt 单元测试的 SSDT 项目。

在家工作时,我总是发现发布此内容并运行所有测试(来自部署后脚本)是有问题的(针对 localdb 和 SQL Server 开发人员版)。

发布无限期挂起,我最终不得不杀死 Visual Studio。

等待类型是PREEMPTIVE_OS_AUTHORIZATIONOPS,等待这个(来自sys.dm_exec_sql_text)的语句的一个例子是

(@r BIT OUTPUT)
SELECT @r = CASE
              WHEN I.Version = I.ClrVersion THEN 1
              ELSE 0
            END
FROM   tSQLt.Info() AS I; 
Run Code Online (Sandbox Code Playgroud)

我也通过调用重现这个

SELECT tSQLt.Private::Info()
Run Code Online (Sandbox Code Playgroud)

这是一个简单的方法

public static SqlString Info()
{
  return (SqlString) Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我假设它正在尝试联系域控制器以建立我有一些权限或其他权限。我在其他 CLR 程序集上没有得到这个,因此怀疑这可能与 TSQLT 不是SAFE_ACCESS程序集有关(权限集是EXTERNAL_ACCESS)。

任何人都知道这里发生了什么以及我如何解决此问题并在与公司网络断开连接的情况下工作而不会遇到此问题?

sql-server wait-types sql-clr tsqlt

6
推荐指数
2
解决办法
654
查看次数

SQL Server 2016 并发限制?数据库并发调优

我有一个包含约 10 亿条时间戳记录的表,每条记录都包含一个会话表的 FK(每天一个会话和每天 3-500,000 条记录),因此查找给定日期的记录只是一个整数连接。

我正在尝试分析此表中的数据(数据按会话分组),当使用客户端计算机上的 C# 控制台应用程序时,我可以在 70 分钟内运行完整的分析(每条记录)。当我尝试直接在 TSQL 中运行类似的分析时,需要 12 多个小时。我预计会有一些惩罚,因为 TSQL 查询使用标量函数和自定义聚合 (clr)。

我的问题:在 C# 中,我了解如何最大化和调整并发性,因此 70 分钟是一个调整过的数字。是否可以直接在 SQL 中调整最大并发的查询,还是最好留给 C# api?(我也可以在 R、数据库或外部完成这项工作,但 .Net 并发 API 给我留下了优越的印象。)

询问:

SELECT TypeNumber, SessionId, dbo.udf_SessionName([timestamp]) SessionName, 
CAST(max(price)-min(price) AS REAL) as Variance, sum(EventNumber) as Volume, 
dbo.Direction(price,[timestamp]) as MoveDirection
INTO temp.AnalysisResults
FROM MyTable
WHERE ISNULL(price,0)<>0
GROUP BY TypeNumber, SessionId, dbo.udf_SessionName([timestamp])
Run Code Online (Sandbox Code Playgroud)

杂项

  • 由于插入,为此查询启用了批量记录
  • 此查询中未使用主键(它是跨三个字段的复合键,此处不需要。但是,查询计划显示正在扫描此索引,而不是我在下面提到的索引(该计划最初推荐) )。
  • 行级压缩已启用
  • 数据跨越五年,每个月有一个只读文件组(按月分区);所有文件组都驻留在同一个 SSD 上(不太好,我知道)
  • 索引:非聚集在 SessionId asc 上,包括 TypeNumber、Timestamp、Price
  • 4 个 CPU 内核可用
  • 标量函数获取每个时间戳,使用 AT …

performance sql-server functions sql-clr sql-server-2016 query-performance

6
推荐指数
1
解决办法
269
查看次数

具有持久计算的 CLR 源数据的表标记为 has_unchecked_assembly_data = 1,但 DBCC CHECKTABLE 不会取消设置相同的标志

我们有一个带有列的 OrderLines 表:

Quantity int not null
QtyCancelled int not null
QtyBackorder int not null
QtyPicking int not null
QtyPacking int not null
QtyShiped int not null
Run Code Online (Sandbox Code Playgroud)

计算和持久化列 FulfillmentStatusId 为:

dbo.clr_GetFulfillmentStatusByLineQuantities(Quantity, QtyCancelled, QtyBackorder, QtyPicking, QtyPacking, QtyShiped)
Run Code Online (Sandbox Code Playgroud)

“clr_GetFulfillmentStatusByLineQuantities”,当然,通过标量函数映射到数据库中的 ASSEMBLY,关联方法 (C#) 标记为:

[SqlFunction(DataAccess = None, IsDeterministic = true, IsPrecise = true, SystemDataAccess = None)]
Run Code Online (Sandbox Code Playgroud)

参考这个问题,我已经多次针对这个表运行 DBCC CHECKTABLE ,它仍然保持为 has_unchecked_assembly_data=1。首次将列添加到表中时确实如此,但我相信 DBCC CHECKTABLE 命令在迁移到 SQL 2016 之前已成功。


尽管该表已使用很长时间且 has_unchecked_assembly_data=1,但似乎对该表的功能没有影响。我关心ALTER ASSEMBLY不使用时取消选中数据时,则抛出抛出异常的另一个异常,当我使用该选项,但出现的装配反正“根据MVID”进行更新。

对不起,如果我胡说八道,我不会问太多问题,我主要是潜伏的。

不过,提前致谢!


更新 (20180917T17:34-05:00):感谢 …

sql-server sql-clr computed-column dbcc-checktable

6
推荐指数
1
解决办法
154
查看次数

对 CLR 函数输入参数使用 Strings 而不是 SqlStrings 是否安全?

我有一个通过 C# 代码实现的 CLR 标量 UDF。我注意到,与String数据类型相比,将SqlString数据类型用于输入参数可以显着提高性能。在通往 SQLCLR 级别 5 的阶梯:开发(在 SQL Server 中使用 .NET)中Solomon Rutzky提到了以下原因更喜欢字符串的 SQL 数据类型:

本机公共语言运行时 (CLR) 数据类型和 SQL Server 数据类型之间的主要区别在于,前者不允许 NULL 值,而后者提供完整的 NULL 语义。

...

可以通过 N[VAR]CHAR 的 SqlChars、[VAR]BINARY 的 SqlBytes 和 XML 的 SqlXml.CreateReader() 来实现流值...

...

使用 SqlString(不是字符串,甚至不是 SqlChars)时,您可以访问 CompareInfo、CultureInfo、LCID 和 SqlCompareOptions 属性...

我知道我的输入永远不会为 NULL,我不需要将值传入,并且我永远不会检查排序规则属性。我的情况可能是一个例外,最好使用String而不是SqlString?如果我确实采用这种方法,有什么需要特别注意的吗?

如果重要的话,我正在使用 SQL Server 的默认排序规则。这是我的源代码的一部分,s1作为输入参数:

fixed (char* chptr = s1)
{
    char* cp = (char*)current;

    for (int i …
Run Code Online (Sandbox Code Playgroud)

sql-server best-practices datatypes sql-clr sql-server-2017

6
推荐指数
1
解决办法
425
查看次数

如何在 C# SQLCLR 函数中将多个双精度数组作为表返回

我拥有的是一个SqlFunction生成 3 个双精度数组的CLR 。我希望这个函数返回一些适当的东西,以便FillRowMethod可以将它作为 T-SQL 中的表输出给我。它适用于 1 个数组,但我无法将其扩展到多个数组。我主要不确定从我的方法返回什么。下面的一些代码:

[SqlFunction(DataAccess = DataAccessKind.Read, FillRowMethodName = "FillRow",
    TableDefinition = "impliedVol float, maturity float, strike float")]
public static IEnumerable getStrippedCapletVolatilitiesFromCapVolatilityCurve(
     string uploadDate, double strike, double yearsForward, double intervalDuration,
     string curve, string surface)
    
//Create 3 arrays of doubles
    double[] array1;
    double[] array2;
    double[] array3;

    return [???];
}
    

public static void FillRow(object obj,
     out SqlDouble impliedVol, out SqlDouble maturity, out SqlDouble strike)
{
   //impliedVol = (double)obj;  //This is what I do if …
Run Code Online (Sandbox Code Playgroud)

sql-server c# sql-clr set-returning-functions

6
推荐指数
1
解决办法
287
查看次数