Sql 使用文件路径在不安全模式下创建程序集不会在数据库中创建函数

Sql 使用文件路径在不安全模式下创建程序集不会在数据库中创建函数,sql,sql-server,sql-server-2012,sqlclr,Sql,Sql Server,Sql Server 2012,Sqlclr,我正在尝试使用以下语句在SQL Server中注册CLR程序集: CREATE ASSEMBLY SQLCLRTest AUTHORIZATION [dbo] FROM 'C:\MyApp\SQLCLRTest.dll' WITH PERMISSION_SET = UNSAFE; CLR程序集是用pfx密钥签名的,我已经创建了一个非对称密钥和一个类似SQL的登录名,以允许在设置了不安全权限的情况下安装此特定程序集 问题是上面的语句在数据库中创建了程序集,但它没有显示我在程序集中创建的任何sql

我正在尝试使用以下语句在SQL Server中注册CLR程序集:

CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 'C:\MyApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
CLR程序集是用pfx密钥签名的,我已经创建了一个非对称密钥和一个类似SQL的登录名,以允许在设置了不安全权限的情况下安装此特定程序集

问题是上面的语句在数据库中创建了程序集,但它没有显示我在程序集中创建的任何sql server函数

我看不到我的CLR程序集有任何问题,因为当我在Visual Studio中通过SQL Server数据库项目发布数据库时,我可以看到在数据库中创建的所有函数。当我查看发布脚本时,我可以看到数据库项目使用程序集的二进制文件。这意味着,它执行类似于

CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF000.......
WITH PERMISSION_SET = UNSAFE;
所以我的问题是为什么程序集通过DLL二进制文件正确注册,而不是在我使用DLL的路径时注册

在此方面的任何帮助都将不胜感激


数据库服务器:SQL server 2012。数据库项目是在Visual Studio 2013中创建的。CLR程序集是在Visual Studio 2013中作为单独的类库项目创建的

Visual Studio中的发布步骤还包括一个单独的脚本,用于创建嵌入到SQLCLR程序集中的函数和过程。因此,VisualStudio正在为您完成这两项工作


执行创建程序集脚本不会创建函数或过程。它只是将程序集公开给SQLCLR。以以下方式创建部件时,必须手动/单独创建它们

Visual Studio中的发布步骤还包括一个单独的脚本,用于创建嵌入到SQLCLR程序集中的函数和过程。因此,VisualStudio正在为您完成这两项工作

执行创建程序集脚本不会创建函数或过程。它只是将程序集公开给SQLCLR。以以下方式创建部件时,必须手动/单独创建它们

为什么程序集通过DLL二进制文件正确注册,而不是在我使用DLL的路径时注册

问题不在于创建您所指的注册程序集。如果在运行“创建程序集”时未出现错误,则该程序集已成功创建

但是,程序集本身仅包含可由T-SQL包装器对象引用的.NET方法,但创建程序集不会自动创建这些T-SQL包装器对象。这些都需要明确地创建

SSDT使用的主发布脚本是一个diff/incremental脚本,用于将目标DB提升到项目所暗示的状态。如果要始终获取CREATE语句,而不管部署了什么更改,请确保:

一定要选中项目属性的SQLCLR选项卡上的Generate DDL选项。此选项控制是否生成包装器对象CREATE语句,即CREATE过程、CREATE函数、CREATE类型、CREATE AGGRATE和CREATE触发器语句

(可选)选中“项目属性”的“项目设置”选项卡上的“创建脚本.sql文件”复选框。选中此选项后,每次生成时都会有一个{build tab.BuildOutputPath}\{build tab.BuildOutputFileName}\u Create.sql脚本。该_Create.sql脚本将始终包含Create ASSEMBLY语句

执行生成时,始终会有一个obj\Debug\{SQLCLR tab.AssemblyName}.generated.sql脚本。该脚本将始终包含CREATEASSEMBLY语句。如果上面选中了Generate DDL选项,则该脚本还将包含CREATE过程、CREATE函数、CREATE TYPE、CREATE AGGRATE和CREATE TRIGGER语句。此脚本不完全可运行,因为它是无序的,但此脚本中的语句用于生成发布脚本和可选的创建脚本

如果您在上面选中了Create script选项2,那么,假设您也再次选中了Generate DDL选项1,那么Create过程、Create函数、Create类型、Create AGGRATE和Create触发器语句也将位于{Build tab.BuildOutputPath}\{Build tab.BuildOutputFileName}\u Create.sql脚本中。在这个脚本中,语句的顺序是正确的

为什么程序集通过DLL二进制文件正确注册,而不是在我使用DLL的路径时注册

问题不在于创建您所指的注册程序集。如果在运行“创建程序集”时未出现错误,则该程序集已成功创建

但是,程序集本身仅包含可由T-SQL包装器对象引用的.NET方法,但创建程序集不会自动创建这些T-SQL包装器对象。这些都需要明确地创建

SSDT使用的主发布脚本是一个diff/incremental脚本,用于将目标DB提升到st 您的项目暗示了ate。如果要始终获取CREATE语句,而不管部署了什么更改,请确保:

一定要选中项目属性的SQLCLR选项卡上的Generate DDL选项。此选项控制是否生成包装器对象CREATE语句,即CREATE过程、CREATE函数、CREATE类型、CREATE AGGRATE和CREATE触发器语句

(可选)选中“项目属性”的“项目设置”选项卡上的“创建脚本.sql文件”复选框。选中此选项后,每次生成时都会有一个{build tab.BuildOutputPath}\{build tab.BuildOutputFileName}\u Create.sql脚本。该_Create.sql脚本将始终包含Create ASSEMBLY语句

执行生成时,始终会有一个obj\Debug\{SQLCLR tab.AssemblyName}.generated.sql脚本。该脚本将始终包含CREATEASSEMBLY语句。如果上面选中了Generate DDL选项,则该脚本还将包含CREATE过程、CREATE函数、CREATE TYPE、CREATE AGGRATE和CREATE TRIGGER语句。此脚本不完全可运行,因为它是无序的,但此脚本中的语句用于生成发布脚本和可选的创建脚本


如果您在上面选中了Create script选项2,那么,假设您也再次选中了Generate DDL选项1,那么Create过程、Create函数、Create类型、Create AGGRATE和Create触发器语句也将位于{Build tab.BuildOutputPath}\{Build tab.BuildOutputFileName}\u Create.sql脚本中。在此脚本中,语句的顺序正确。

添加程序集和在其中注册/添加函数应是两个独立的步骤添加程序集和在其中注册/添加函数应是两个独立的步骤,请稍微澄清:当您构建包含SQLCLR代码的数据库项目时,它将自动生成必要的DDL来包装.Net方法。这包含在.generated.sql文件中,可以在项目的obj文件夹中找到。Project Publish将正确处理此问题,但如果要手动部署,则需要执行这些语句以链接到Assembly@KevinCunnane谢谢我澄清了澄清-稍微澄清一下:当您构建包含SQLCLR代码的数据库项目时,它将自动生成必要的DDL来包装您的.Net方法。这包含在.generated.sql文件中,可以在项目的obj文件夹中找到。Project Publish将正确处理此问题,但如果要手动部署,则需要执行这些语句以链接到Assembly@KevinCunnane谢谢我澄清了澄清-