為什麼要在SQLServer呼叫C# function呢?
因為有些功能可能SQLServer做不到,或是太困難.
以下會介紹,怎麼建立dll.
與建立dll後,怎麼部署到SQLServer 和使用
開發環境
VS2013
SQLServer 2014
*適用於 SQL Server 2008 至 SQL Server 2017
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'。不支援多載的方法、屬性或欄位。
-----------------------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