通过


结合使用 SQL Server 和可验证的程序集 (C++/CLI)

打包为动态链接库 (DLL) 的扩展存储过程提供了一种方法,该方法通过使用 Visual C++ 开发的函数扩展 SQL Server 功能。 扩展存储过程作为 DLL 中的函数实现。 除函数之外,扩展存储过程还可以定义用户定义的类型和聚合函数(例如 SUM 或 AVG )。

当客户端执行扩展存储过程时,SQL Server 搜索与扩展存储过程关联的 DLL 并加载 DLL。 SQL Server 调用请求的扩展存储过程,并在指定的安全性上下文下执行它。 然后,扩展存储过程传递结果集并将参数返回给服务器。

SQL Server 提供 Transact-SQL (T-SQL) 的扩展,你可以将可验证程序集安装到 SQL Server 中。 SQL Server 权限集指定具有以下安全级别的安全性上下文:

  • 无限制模式:自行承担运行代码的风险;代码不必是可验证的类型安全。

  • 安全模式:运行可验证类型安全的代码;使用 /clr:safe 进行编译。

重要

弃用的 Visual Studio 2015 和 Visual Studio 2017 不支持“/clr:pure”和“/clr:safe”创建可验证项目。 如果需要可验证的代码,建议你将代码转换为 C#。

若要创建可验证程序集并将其加载到 SQL Server 中,请使用 Transact-SQL 命令 CREATE ASSEMBLY 和 DROP ASSEMBLY,如下所示:

CREATE ASSEMBLY <assemblyName> FROM <'Assembly UNC Path'> WITH
  PERMISSION_SET <permissions>
DROP ASSEMBLY <assemblyName>

PERMISSION_SET 命令指定安全性上下文,并且可以具有 UNRESTRICTED、SAFE 或 EXTENDED 值。

此外,可以使用 CREATE FUNCTION 命令绑定到类中的方法名称:

CREATE FUNCTION <FunctionName>(<FunctionParams>)
RETURNS returnType
[EXTERNAL NAME <AssemblyName>:<ClassName>::<StaticMethodName>]

示例

以下 SQL 脚本(例如“MyScript.sql”)将程序集加载到 SQL Server 并使类的方法可用:

-- Create assembly without external access
drop assembly stockNoEA
go
create assembly stockNoEA
from
'c:\stockNoEA.dll'
with permission_set safe

-- Create function on assembly with no external access
drop function GetQuoteNoEA
go
create function GetQuoteNoEA(@sym nvarchar(10))
returns real
external name stockNoEA:StockQuotes::GetQuote
go

-- To call the function
select dbo.GetQuoteNoEA('MSFT')
go

SQL 脚本可以在 SQL 查询分析器或带有 sqlcmd.exe 实用程序的命令行中以交互方式执行。 以下命令行可用于连接到 MyServer,使用默认数据库,使用受信任的连接,输入 MyScript.sql 以及输出 MyResult.txt.

sqlcmd -S MyServer -E -i myScript.sql -o myResult.txt

另请参阅

类和结构