返回值的T-SQL和CLR类型不匹配

Rem*_*sen 4 t-sql sql-server clr integration types

我正在尝试通过CLR集成创建自定义SQL函数,但我遇到了T-SQL和CLR类型不匹配错误.

DLL:

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server

Public Class Encrypter_Decrypter
    <SqlFunction(DataAccess:=DataAccessKind.Read)> _
    Public Shared Function EncryptString(ByVal strItem As String)
        Dim strPassPhrase As String = "***********"
        Dim strInitVector As String = "***********"
        Dim objEncryption = New PCI.Encryption()
        objEncryption.Initialise(strPassPhrase, strInitVector, -1, -1, -1, "", "", 1)
        Dim EncryptedString As String = objEncryption.Encrypt(strItem)
        objEncryption = Nothing
        EncryptString = EncryptedString
    End Function
End Class
Run Code Online (Sandbox Code Playgroud)

创建SQL函数:

CREATE ASSEMBLY EncrypterDecrypter 
FROM 'c:\dll\Encrypter_Decrypter\Encrypter_Decrypter.dll'
WITH PERMISSION_SET = SAFE
GO

CREATE FUNCTION EncryptString(@strItem NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) 
AS EXTERNAL NAME EncrypterDecrypter.Encrypter_Decrypter.EncryptString; 
GO
Run Code Online (Sandbox Code Playgroud)

错误:

"EncryptString"的CREATE FUNCTION失败,因为返回值的T-SQL和CLR类型不匹配.

有人知道我错过了什么吗?

谢谢 :)

Dam*_*ver 6

你在As String函数定义的末尾错过了一个:

Public Shared Function EncryptString(ByVal strItem As String) As String
Run Code Online (Sandbox Code Playgroud)

显然没有Option Explicit或没有Option Strict打开(其中任何一个会提醒你这个问题).默认情况下,函数的返回类型是Object,没有映射到任何SQL Server数据类型.


不知道你的加密包是做什么的,将加密版本存储为字符串通常也是一个糟糕的计划(除非你的软件包自动执行例如Base64编码?)