打包为动态链接库 (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