iT邦幫忙

8

[MS SQL] 在SQLServer呼叫C# function

為什麼要在SQLServer呼叫C# function呢?
因為有些功能可能SQLServer做不到,或是太困難.

以下會介紹,怎麼建立dll.
與建立dll後,怎麼部署到SQLServer 和使用

開發環境
VS2013
SQLServer 2014
*適用於 SQL Server 2008 至 SQL Server 2017

建立dll

1.setup SSDT for VS2013
2.新增專案Database1 新增專案/其它語言/SQLServer/SQL Server資料庫專案
3.加入新項目 SQL CLR C# 使用者定義函式

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString Hi()
    { 
        return new SqlString("Hi!"); 
    }
    public static SqlString Hi3(string name)
    { 
        return new SqlString("Hi,"+name);
    }
}

4.建置,就會在bin裡面看到dll檔
5.把dll放到E槽

◎組件 'Database1' 的類別 'UserDefinedFunctions' 中發現一個以上的方法、屬性或欄位有名稱 'Hi'。不支援多載的方法、屬性或欄位。

部署到SQL Server


-----------------------1.set SQL Server可執行CLR-----------------------
sp_configure 'clr enabled', 1
GO
RECONFIGURE
go

-----------------------2.建立ASSEMBLY-----------------------
DECLARE @SamplesPath nvarchar(1024)  
set @SamplesPath = 'E:\'  

CREATE ASSEMBLY Database1  FROM @SamplesPath+'Database1.dll'
WITH PERMISSION_SET = SAFE;  
--drop ASSEMBLY Database1
go

--chk  有沒有看到Database1
SELECT * FROM sys.assemblies
go

-----------------------3.建立function-----------------------
CREATE FUNCTION [dbo].[Hi](  )--function有幾個參數,這裡就設幾個(function不可以多載)
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [Database1].[UserDefinedFunctions].[Hi]
--drop function Hi
GO
CREATE FUNCTION [dbo].[Hi3](@str [nvarchar](4000) )
RETURNS [nvarchar](4000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [Database1].[UserDefinedFunctions].[Hi3]
GO
--drop function Hi3

-----------------------4.Test-----------------------
select [dbo].[Hi]( )
select [dbo].[Hi3]('帥哥')

--chk  有沒有看到Hi & Hi3
SELECT * FROM sys.assembly_modules;


ref
建立dll
https://dotblogs.com.tw/stanley14/2017/07/15/sqlonlinuxclr
db 設定
https://docs.microsoft.com/zh-tw/sql/database-engine/dev-guide/hello-world-sample?view=sql-server-2014


尚未有邦友留言

立即登入留言