Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2019 (15.x) ve sonraki sürümleri
Bu öğreticide SQL Server'dan iki sütun (kimlik ve metin) ve giriş parametresi olarak normal ifade (regex) alan bir C# sınıfı oluşturmak için SQL Server Dil Uzantıları'nın nasıl kullanılacağı gösterilmektedir. sınıfı, SQL Server'a (kimlik ve metin) iki sütun döndürür.
C# sınıfına gönderilen metin sütunundaki belirli bir metin için kod, verilen normal ifadenin yerine getirilip getirildiğini denetler ve bu metni özgün kimlikle birlikte döndürür.
Bu örnek kod, bir metnin veya c#sözcüğünü C# içerip içermediğini denetleen normal bir ifade kullanır.
Önkoşullar
Sql Server 2019 (15.x) ve sonraki sürümlerde genişletilebilirlik çerçevesi ve Windows üzerinde .NET programlama uzantısı ile Veritabanı Altyapısı örneği. Daha fazla bilgi için bkz. SQL Server Dil Uzantıları nedir?. Kodlama gereksinimleri hakkında daha fazla bilgi için bkz. SQL Server Dil Uzantıları'nda .NET çalışma zamanını çağırma.
T-SQL yürütmek için SQL Server Management Studio veya Azure Data Studio.
Windows'da .NET 6 veya üzeri SDK.
dotnet-core-CSharp-lang-extension-windows-release.zipSQL Server için C# için Microsoft Genişletilebilirlik SDK'sından alınan dosya.
kullanarak dotnet build komut satırı derlemesi bu öğretici için yeterlidir.
Örnek veri oluşturma
İlk olarak yeni bir veritabanı oluşturun ve bir testdata tabloyu ve text sütunlarıyla ID doldurun.
CREATE DATABASE csharptest;
GO
USE csharptest;
GO
CREATE TABLE testdata
(
[id] INT,
[text] VARCHAR (100)
);
GO
INSERT INTO testdata (id, "text") VALUES (4, 'This sentence contains C#');
INSERT INTO testdata (id, "text") VALUES (1, 'This sentence does not');
INSERT INTO testdata (id, "text") VALUES (3, 'I love c#!');
INSERT INTO testdata (id, "text") VALUES (2, NULL);
GO
Ana sınıfı oluşturma
Bu adımda adlı RegexSample.cs bir sınıf dosyası oluşturun ve aşağıdaki C# kodunu bu dosyaya kopyalayın.
Bu ana sınıf SDK'yı içeri aktarıyor, yani ilk adımda indirilen C# dosyasının bu sınıftan bulunabilir olması gerekiyor.
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using Microsoft.Data.Analysis;
using Microsoft.SqlServer.CSharpExtension.SDK;
using System.Text.RegularExpressions;
namespace UserExecutor
{
/// <summary>
/// This class extends the AbstractSqlServerExtensionExecutor and uses
/// a regular expression that checks if a text contains the word "C#" or "c#"
/// </summary>
public class CSharpRegexExecutor: AbstractSqlServerExtensionExecutor
{
/// <summary>
/// This method overrides the Execute method from AbstractSqlServerExtensionExecutor.
/// </summary>
/// <param name="input">
/// A C# DataFrame contains the input dataset.
/// </param>
/// <param name="sqlParams">
/// A Dictionary contains the parameters from SQL server with name as the key.
/// </param>
/// <returns>
/// A C# DataFrame contains the output dataset.
/// </returns>
public override DataFrame Execute(DataFrame input, Dictionary<string, dynamic> sqlParams){
// Drop NULL values and sort by id
//
input = input.DropNulls().OrderBy("id");
// Create empty output DataFrame with two columns
//
DataFrame output = new DataFrame(new PrimitiveDataFrameColumn<int>("id", 0), new StringDataFrameColumn("text", 0));
// Filter text containing specific substring using regex expression
//
DataFrameColumn texts = input.Columns["text"];
for(int i = 0; i < texts.Length; ++i)
{
if(Regex.IsMatch((string)texts[i], sqlParams["@regexExpr"]))
{
output.Append(input.Rows[i], true);
}
}
// Modify the parameters
//
sqlParams["@rowsCount"] = output.Rows.Count;
sqlParams["@regexExpr"] = "Success!";
// Return output dataset as a DataFrame
//
return output;
}
}
}
DLL dosyası derleme ve oluşturma
Sınıflarınızı ve bağımlılıklarınızı bir DLL'ye paketle. adlı RegexSample.csproj bir .csproj dosya oluşturabilir ve aşağıdaki kodu bu dosyaya kopyalayabilirsiniz.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
<PropertyGroup>
<OutputPath>$(BinRoot)/$(Configuration)/</OutputPath>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Analysis" Version="0.4.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="Microsoft.SqlServer.CSharpExtension.SDK">
<HintPath>[path]\Microsoft.SqlServer.CSharpExtension.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
Proje klasörüne gidin ve aşağıdaki dosyayı oluşturan komutunu çalıştırın dotnet build:
path\to\project\bin\Debug\RegexSample.dll
Daha fazla bilgi için bkz. C# projesinden .NET DLL oluşturma.
Dış dil oluşturma
Veritabanında bir dış dil oluşturmanız gerekir. Dış dil, veritabanı kapsamlı bir nesnedir; bu da C# gibi dış dillerin kullanmak istediğiniz her veritabanı için oluşturulması gerektiği anlamına gelir.
Uzantıyı içeren bir
.zipdosya oluşturun.Windows'da SQL Server kurulumunun bir parçası olarak, .NET uzantı
.zipdosyası şu konuma yüklenir:<SQL Server install path>\MSSQL\Binn>\dotnet-core-CSharp-lang-extension.zip. Bu zip dosyası dosyasınınativecsharpextension.dlliçerir.Dosyadan
.zipbir dış dildotnetoluşturun:CREATE EXTERNAL LANGUAGE [dotnet] FROM ( CONTENT = N'<path>\dotnet-core-CSharp-lang-extension.zip', FILE_NAME = 'nativecsharpextension.dll' ); GO
İzinleri ayarlama
.NET C# kodunu yürütmek için kullanıcıya SID S-1-15-2-1 (<LocalMachineName>\ALL APPLICATION PACKAGES) klasör için \MSSQL okuma izinleri verilmesi gerekir.
- Klasöre sağ tıklayın ve Özellikler Güvenliği'ni> seçin
- Düzenle'yi seçin
- Ekle'yi seçin
-
Kullanıcıları, Bilgisayarı, Hizmet Hesaplarını veya Grupları Seçin bölümünde:
- Nesne Türleri'ne tıklayın ve Yerleşik güvenlik ilkeleri ile Gruplar'ın seçili olduğundan emin olun
- Konumlar'ı seçerek listenin en üstündeki yerel bilgisayar adını seçin
- girin
ALL APPLICATION PACKAGES, adı denetleyin ve eklemek için Tamam'ı seçin. Ad çözümlenmezse Konumlar adımını yeniden ziyaret edin. Sistem tanımlayıcısı (SID), makinenizde yereldir.
Daha fazla bilgi için bkz. CREATE EXTERNAL LANGUAGE.
Dış kitaplıklar oluşturma
DLL dosyalarınız için bir dış kitaplık oluşturmak için CREATE EXTERNAL LIBRARY kullanın. SQL Server'ın dosyalara .dll erişimi vardır ve için özel izinler classpathayarlamanız gerekmez.
RegEx kodu için bir dış kitaplık oluşturun.
CREATE EXTERNAL LIBRARY [regex.dll]
FROM (CONTENT = N'<path>\RegexSample.dll')
WITH (LANGUAGE = 'Dotnet');
GO
C# sınıfını çağırma
SQL Server'dan C# kodunu çağırmak için saklı yordamı sp_execute_external_script çağırın. Betik parametresinde, çağırmak istediğiniz öğesini libraryname;namespace.classname tanımlayın. Ayrıca, kitaplık adını belirtmeden hangi namespace.classname çağrıyı yapmak istediğinizi de tanımlayabilirsiniz. Uzantı, eşleşen namespace.classnameilk kitaplığı bulur. Aşağıdaki kodda sınıfı adlı bir ad alanına ve adlı UserExecutorCSharpRegexExecutorbir sınıfa aittir.
Kod, çağrılacak yöntemi tanımlamaz. Varsayılan olarak yöntemi Execute çağrılır. Bu, SQL Server'dan sınıfı çağırabilmek istiyorsanız SDK arabirimini izlemeniz ve C# sınıfınızda bir Execute yöntem uygulamanız gerektiği anlamına gelir.
Saklı yordam bir giriş sorgusu (giriş veri kümesi) ve bir normal ifade alır ve verilen normal ifadeyi karşılayan satırları döndürür. Bir metnin veya c#sözcüğünü C# içerip içermediğini denetleen normal bir ifade [Cc]# kullanır.
DECLARE @rowsCount AS INT;
DECLARE @regexExpr AS VARCHAR (200);
SET @regexExpr = N'[Cc]#';
EXECUTE sp_execute_external_script
@language = N'dotnet',
@script = N'regex.dll;UserExecutor.CSharpRegexExecutor',
@input_data_1 = N'SELECT * FROM testdata',
@params = N'@regexExpr VARCHAR(200) OUTPUT, @rowsCount INT OUTPUT',
@regexExpr = @regexExpr OUTPUT,
@rowsCount = @rowsCount OUTPUT
WITH RESULT SETS
(
(id INT, TEXT VARCHAR (100))
);
SELECT @rowsCount AS rowsCount, @regexExpr AS message;
Results
Çağrıyı yürütürken, iki satır içeren bir sonuç kümesi almanız gerekir.