Esempio Hello World
Nell'esempio Hello World vengono illustrate le operazioni di base per la creazione, la distribuzione e il test di una stored procedure semplice basata sull'integrazione con CLR. Nell'esempio viene inoltre illustrato come restituire dati tramite un record, che viene costruito in modo dinamico dalla stored procedure e restituito al chiamante.
La stored procedure HelloWorld restituisce la stringa "Hello world!" in un set di risultati composto da una riga. In questo esempio sono illustrati alcuni metodi di utilizzo per le classi Microsoft.SqlServer.Server.SqlMetaData, Microsoft.SqlServer.Server.SqlDataRecord e Microsoft.SqlServer.Server.Pipe.
Prerequisiti
Per creare ed eseguire questo progetto, è necessario installare il software seguente:
SQL Server o SQL Server Express. SQL Server Express è disponibile gratuitamente nel sito Web di documentazione ed esempi per SQL Server Express.
Database AdventureWorks, disponibile nel sito Web per sviluppatori di SQL Server.
.NET Framework SDK 2.0 o versione successiva oppure Microsoft Visual Studio 2005 o versione successiva. .NET Framework SDK è disponibile gratuitamente.
È necessario inoltre che siano soddisfatte le condizioni seguenti:
Per l'istanza di SQL Server utilizzata deve essere abilitata l'integrazione con CLR.
Per abilitare l'integrazione con CLR, effettuare le operazioni seguenti:
Abilitazione dell'integrazione con CLR
- Eseguire i comandi Transact-SQL seguenti:
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
[!NOTA]
Per abilitare CLR, è necessario disporre dell'autorizzazione ALTER SETTINGS a livello di server, che viene assegnata implicitamente ai membri dei ruoli predefiniti del server sysadmin e serveradmin.
Il database AdventureWorks deve essere installato nell'istanza di SQL Server in uso.
Se non si dispone dei diritti di amministratore per l'istanza di SQL Server in uso, è necessario ricevere da un amministratore l'autorizzazione CreateAssembly per completare l'installazione.
Compilazione dell'esempio
Creare ed eseguire l'esempio tramite le istruzioni seguenti:
Aprire un prompt dei comandi di .NET Framework o Visual Studio.
Se necessario, creare una directory per l'esempio. Per questo esempio verrà utilizzata la directory C:\MySample.
In c:\MySample creare HelloWorld.vb (per l'esempio Visual Basic) o HelloWorld.cs (per l'esempio C#) e copiare nel file il codice di esempio appropriato, Visual Basic o C#, riportato di seguito.
Compilare il codice di esempio dal prompt della riga di comando eseguendo una delle istruzioni seguenti, a seconda del linguaggio scelto.
vbc C:HelloWorld.vb /target:library
csc /target:library HelloWorld.cs
Copiare il codice di installazione Transact-SQL in un file e salvarlo come Install.sql nella directory dell'esempio.
Distribuire l'assembly e la stored procedure eseguendo
- sqlcmd -E -I -i install.sql -v root = "C:\MySample\"
Copiare lo script di comandi di test Transact-SQL in un file e salvarlo come test.sql nella directory dell'esempio.
Eseguire lo script di test con il comando seguente
- sqlcmd -E -I -i test.sql
Copiare lo script di pulizia Transact-SQL in un file e salvarlo come cleanup.sql nella directory dell'esempio.
Eseguire lo script con il comando seguente
- sqlcmd -E -I -i cleanup.sql
Codice di esempio
Di seguito sono illustrati i listati di codice per l'esempio.
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
Di seguito è illustrato lo script di installazione Transact-SQL (Install.sql) che consente la distribuzione dell'assembly e la creazione della stored procedure nel database.
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
Di seguito è illustrato lo script test.sql che consente di testare l'esempio eseguendo la stored procedure.
use AdventureWorks
go
execute usp_HelloWorld
USE AdventureWorks;
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
Il codice Transact-SQL seguente consente di rimuovere l'assembly e la stored procedure dal database.
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
Vedere anche
Concetti
Scenari di utilizzo ed esempi per l'integrazione con CLR (Common Language Runtime)