我有一个Visual Studio 2013数据库项目这需要一个修改版本的FASTJSON作为参考。我在参考属性中选择了 Generate DDL,如下图所示:

在 .sqlproj msbuild 文件中:
<Reference Include="fastJSON">
<HintPath>..\..\fastjson\output\net40\fastJSON.dll</HintPath>
<GenerateSqlClrDdl>True</GenerateSqlClrDdl>
</Reference>
Run Code Online (Sandbox Code Playgroud)
但是 bin/debug/Project.sql 不包含CREATE ASSEMBLY fastJSON . . .. 手动添加程序集工作,然后我的项目将部署和运行。我该怎么做才能让 Visual Studio 部署我的程序集?
我正在尝试使用 System.Web 的 HTTPUtility.UrlDecode 方法部署 SQL CLR 函数,但我无法部署它。收到错误:
.Net SqlClient 数据提供程序:消息 6503,级别 16,状态 12,第 1 行程序集“system.web,版本=4.0.0.0,文化=中性,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);
}
}
Run Code Online (Sandbox Code Playgroud)
它与这个线程有关。我是带有 VS2012 SSDT 和数据库项目的 SQL Server 2014。已尝试使用其他目标框架,例如 3、3.5、4 和 4.5。
我也尝试过使用 System.Web 创建程序集,但随后必须添加其他程序集,例如 Microsoft.Build、System.Xaml,直到它们也失败。我看到 System.Web 不在支持的库列表中,所以有什么想法吗?
是否存在为存储过程中的所有结果集返回元数据的过程?
类似于sys.dm_exec_describe_first_result_set_for_object,但对于所有结果集?
最终,我想发现数据库中每个存储过程中每个结果集的元数据。现在,我只会满足于sys.dm_exec_describe_first_result_set_for_object无法描述的结果集。即第 2、第 3 和第 N 个结果集。
现在考虑使用 SQLCLR 来执行此操作:
如何保存具有多个结果集的过程的结果
tSQLt - SQL Server 的 DB 单元测试 - ResultSetFilter.cs
内置的hierarchyid是一个CLR,它以高效的二进制形式存储路径,并提供其他有用的功能。
不幸的是,所表示的路径的深度是有限的,对于二叉树来说大约是 1427。对于必然会达到此限制的复杂现有应用程序,我想增加该限制。我不想改变类型的界面。我不相信我可以改变类型的接口而不将细微的错误引入所有必须更改的代码中。
我可以(理论上)创建一个“binhierarchyid”CLR UDT,它实现与hierarchyid 相同的接口,但只支持二叉树。这应该让我获得 ~7000 的深度,同时仍然保持在 900 字节的限制内。不知道这将是一项多大的事业。
这个hierarchyid CLR的来源是否在某处可用,以便我可以基于它创建自己的支持更深层次的结构?
我们正在使用 SQLCLR 存储过程来激活服务代理,我想监视 CLR 代码使用的内存。查看sys.dm_os_memory_clerks,我看到只有 NUMA 节点 1 具有与该MEMORYCLERK_SQLCLR类型关联的任何页面。服务器有两个 8 核 CPU,运行 SQL 2014 CU6。
这是预期的吗?或者我应该像我一样看到两个节点上使用的内存MEMORYCLERK_SQLBUFFERPOOL?
询问:
SELECT DOMC.memory_node_id
, DOMC.pages_kb
, DOMC.virtual_memory_reserved_kb
, DOMC.virtual_memory_committed_kb
FROM sys.dm_os_memory_clerks DOMC where type = 'MEMORYCLERK_SQLCLR'
Run Code Online (Sandbox Code Playgroud)
结果:
memory_node_id pages_kb virtual_memory_reserved_kb virtual_memory_committed_kb
-------------- -------------------- -------------------------- ---------------------------
0 88232 12607744 1408652
1 0 0 0
64 0 0 0
Run Code Online (Sandbox Code Playgroud) PostgreSQL 支持DOMAIN规范,来自 SQL 2011 工作草案规范,
域是命名的用户定义对象,可以在某些可以指定数据类型的地方将其指定为数据类型的替代。域由数据类型、可能是默认选项和零个或多个(域)约束组成。
这使我们能够做一些非常酷的事情,例如通过不区分大小写的文本类型为电子邮件实现HTML5 规范的域。它确保所有访问数据库的客户端都对插入的数据进行完整性检查。
CREATE DOMAIN email AS citext
CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' );
Run Code Online (Sandbox Code Playgroud)
SQL Server 是否支持触发器系统之外的任何此类功能?
我认为这是一个权限问题,但我无法找到它。
我在一台服务器(SQL Server 2016)上有一组 CLR,它们可以正常工作。所有这些都被标记为 UNSAFE,并且它们执行各种类型的文件 I/O(读取、写入、复制、移动、重命名等)。我可以通过 SSMS 或同样轻松地从工作中运行它们。
我需要将它们安装在另一台服务器(也是 SQL Server 2016)上。使用原始的 Visual Studio 项目,我已将它们部署到新服务器。它们出现在 SSMS 中。那部分看起来不错。
当我从 SSMS 尝试运行一个时,我收到以下错误:“拒绝访问路径‘我传入的任何路径’。”
我在 Windows 登录下登录到 SSMS。我有数据库的权限,我是 dbo。我是服务器管理员。我在文件系统中有权限。
我还能缺少什么?
我的数据库目前被隔离在它自己的实例和 VM 中。我的客户正在淘汰该服务器,我需要将数据库迁移到新环境。我的数据库使用 CLR,所以新环境需要启用它。
客户建议使用现有服务器和现有 SQLServer 2014 标准实例托管来自其他软件供应商的数据库。我担心会产生一种“你破坏它,你买了它”的责任,因为我不能保证其他数据库或其前端的安全策略。我不想做会带来重大风险的事情。
我不时遇到与其他客户类似的情况。我是一名数据库开发人员。我偶尔会为我的中小型企业客户提供与我自己的产品相关的 DBA 服务,但我绝不是一名熟练的 DBA。每个客户都有不同的预算、优先级、IT 人员和安全策略,但通常他们都没有 IT/DBA 可以理解和/或在此详细级别进行称职的风险评估。
在共享实例上启用 CLR 会如何影响其他 DB 的安全性?(我不是在询问数据库级别的权限集级别,只是启用 CLR 本身)。我需要充分了解风险(如果有的话),以便能够建议“最佳实践”和特定于客户的“足够安全”的替代方案。
在触发器中,我试图创建一个唯一的表名(使用NEWID()),我可以存储在插入和删除的表中找到的数据。
Declare @NewID varchar(50) = Replace(convert(Varchar(50),NEWID()),'-','')
Declare @SQLStr varchar(8000)
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:无效的对象名称“插入”
我知道我可以做到:
Select * into #inserted from inserted
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from #inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)
但是我不想使用 TempDB,因为这些表会变得很大,而且我也觉得它是多余的。有没有办法避免创建#inserted?
我问了一个关于XML使用XSD schemainside验证的问题SQL Server 2012(见链接)。我明白(正如我怀疑的那样)我需要使用CLR Function. 该函数将获取XSD schema text并XML text进行验证。
我将有 1 个配置数据库和许多安装数据库。从那个角度来看,我想知道在哪里创建该功能 - 在配置数据库中还是在每个安装数据库中?
从支持的角度来看,最好只有一个 CLR 功能。
sql-clr ×10
sql-server ×9
datatypes ×1
domain ×1
dynamic-sql ×1
files ×1
functions ×1
hierarchy ×1
metadata ×1
numa ×1
permissions ×1
security ×1
sql-standard ×1
t-sql ×1
trigger ×1
xml ×1