Hello World 示例

Hello World 示例演示了创建、部署和测试基于集成的简单公共语言运行时(CLR)存储过程所涉及的基本作。 此示例还演示了如何通过记录返回数据,该记录由存储过程动态构造并返回到调用方。

HelloWorld存储过程在结果集中返回字符串“Hello world!”,其中包含一行。 此示例演示了 类Microsoft.SqlServer.Server.SqlMetaDataMicrosoft.SqlServer.Server.SqlDataRecordMicrosoft.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', 1

    GO

    RECONFIGURE

    GO

    注释

    若要启用 CLR,必须具有ALTER SETTINGS由服务器角色成员sysadminserveradmin隐式持有的服务器级别权限。

  • AdventureWorks 数据库必须安装在正在使用的 SQL Server 实例上。

  • 如果你不是正在使用的 SQL Server 实例的管理员,则必须有管理员授予 CreateAssembly 权限才能完成安装。

生成示例

使用以下说明创建并运行示例:

  1. 打开 Visual Studio 或 .NET Framework 命令提示符。

  2. 如有必要,请为示例创建目录。 对于此示例,我们将使用 C:\MySample。

  3. 在 c:\MySample 中,创建 HelloWorld.vb (针对 Visual Basic 示例)或 HelloWorld.cs (对于 C# 示例),并将相应的 Visual Basic 或 C# 示例代码(如下所示)复制到文件中。

  4. 根据所选语言,通过执行以下任一作,从命令行提示符编译示例代码。

    • vbc C:HelloWorld.vb /target:library

    • csc /target:library HelloWorld.cs

  5. 将 Transact-SQL 安装代码复制到文件中,并将其 Install.sql 另存为示例目录中。

  6. 通过执行来部署程序集和存储过程

    • sqlcmd -E -I -i install.sql -v root = "C:\MySample\"
  7. 将 Transact-SQL 测试命令脚本复制到文件中,并将其 test.sql 另存为示例目录中。

  8. 使用以下命令执行测试脚本

    • sqlcmd -E -I -i test.sql
  9. 将 Transact-SQL 清理脚本复制到文件中,并将其 cleanup.sql 另存为示例目录中。

  10. 使用以下命令执行脚本

    • 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  

另请参阅

公共语言运行时 (CLR) 集成的使用方案和示例