Hello World 示例
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 Documentation and Samples (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', 1
GO
RECONFIGURE
GO
注意 若要启用 CLR,您必须具有 ALTER SETTINGS 服务器级别权限,sysadmin 和 serveradmin 固定服务器角色的成员隐式拥有该权限。
必须在您使用的 SQL Server 实例上安装 AdventureWorks 数据库。
如果您不是要使用的 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:library
csc /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