Hello World 示例演示了创建、部署和测试基于集成的简单公共语言运行时(CLR)存储过程所涉及的基本作。 此示例还演示了如何通过记录返回数据,该记录由存储过程动态构造并返回到调用方。
HelloWorld存储过程在结果集中返回字符串“Hello world!”,其中包含一行。 此示例演示了 类Microsoft.SqlServer.Server.SqlMetaData、 Microsoft.SqlServer.Server.SqlDataRecord 和 Microsoft.SqlServer.Server.Pipe 的一些用途。
先决条件
若要创建并运行此项目,必须安装以下软件:
SQL Server 或 SQL Server Express。 可以从 SQL Server Express 文档和示例网站免费获取 SQL Server Express
SQL Server 开发人员网站提供的 AdventureWorks 数据库
.NET Framework SDK 2.0 或更高版本或Microsoft Visual Studio 2005 或更高版本。 可以免费获取 .NET Framework SDK。
此外,必须满足以下条件:
正在使用的 SQL Server 实例必须启用 CLR 集成。
若要启用 CLR 集成,请执行以下步骤:
启用 CLR 集成
- 执行以下 Transact-SQL 命令:
sp_configure 'clr enabled', 1GORECONFIGUREGO注释
若要启用 CLR,必须具有
ALTER SETTINGS由服务器角色成员sysadminserveradmin隐式持有的服务器级别权限。AdventureWorks 数据库必须安装在正在使用的 SQL Server 实例上。
如果你不是正在使用的 SQL Server 实例的管理员,则必须有管理员授予 CreateAssembly 权限才能完成安装。
生成示例
使用以下说明创建并运行示例:
打开 Visual Studio 或 .NET Framework 命令提示符。
如有必要,请为示例创建目录。 对于此示例,我们将使用 C:\MySample。
在 c:\MySample 中,创建
HelloWorld.vb(针对 Visual Basic 示例)或HelloWorld.cs(对于 C# 示例),并将相应的 Visual Basic 或 C# 示例代码(如下所示)复制到文件中。根据所选语言,通过执行以下任一作,从命令行提示符编译示例代码。
vbc C:HelloWorld.vb /target:librarycsc /target:library HelloWorld.cs
将 Transact-SQL 安装代码复制到文件中,并将其
Install.sql另存为示例目录中。通过执行来部署程序集和存储过程
sqlcmd -E -I -i install.sql -v root = "C:\MySample\"
将 Transact-SQL 测试命令脚本复制到文件中,并将其
test.sql另存为示例目录中。使用以下命令执行测试脚本
sqlcmd -E -I -i test.sql
将 Transact-SQL 清理脚本复制到文件中,并将其
cleanup.sql另存为示例目录中。使用以下命令执行脚本
sqlcmd -E -I -i cleanup.sql
示例代码
下面是此示例的代码列表。
C#(编程语言)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void HelloWorld()
{
Microsoft.SqlServer.Server.SqlMetaData columnInfo
= new Microsoft.SqlServer.Server.SqlMetaData("Column1", SqlDbType.NVarChar, 12);
SqlDataRecord greetingRecord
= new SqlDataRecord(new Microsoft.SqlServer.Server.SqlMetaData[] { columnInfo });
greetingRecord.SetString(0, "Hello world!");
SqlContext.Pipe.Send(greetingRecord);
}
};
Visual Basic
Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public NotInheritable Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub HelloWorld()
Dim columnInfo As New Microsoft.SqlServer.Server.SqlMetaData("Column1", _
SqlDbType.NVarChar, 12)
Dim greetingRecord As New SqlDataRecord(New _
Microsoft.SqlServer.Server.SqlMetaData() {columnInfo})
greetingRecord.SetString(0, "Hello World!")
SqlContext.Pipe.Send(greetingRecord)
End Sub
End Class
这是 Transact-SQL 安装脚本(Install.sql),该脚本部署程序集并在数据库中创建存储过程。
USE AdventureWorks
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'HelloWorld')
DROP ASSEMBLY HelloWorld;
GO
DECLARE @SamplesPath nvarchar(1024)
set @SamplesPath = '$(root)'
CREATE ASSEMBLY HelloWorld
FROM @SamplesPath + 'HelloWorld.dll'
WITH permission_set = Safe;
GO
CREATE PROCEDURE usp_HelloWorld
--(
-- @Greeting nvarchar(12) OUTPUT
--)
AS EXTERNAL NAME HelloWorld.[StoredProcedures].HelloWorld;
GO
这是 test.sql通过执行存储过程来测试示例。
use AdventureWorks
go
execute usp_HelloWorld
USE AdventureWorks;
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
以下 Transact-SQL 从数据库中删除程序集和存储过程。
USE AdventureWorks
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'HelloWorld')
DROP ASSEMBLY HelloWorld;
GO