【问题标题】:SQL Server: Could not find type in the assemblySQL Server:在程序集中找不到类型
【发布时间】:2011-12-11 00:43:17
【问题描述】:

假设程序集 dll:

using Microsoft.SqlServer.Server;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System;
using System.Text;

namespace CLRFunctions
{
    public class T
    {
        [SqlFunction(DataAccess = DataAccessKind.Read)]
        public static String NormalizeString(String s, String normalizationForm)
        {
            NormalizationForm form = NormalizationForm.FormC;

            if (String.Equals(f, "FormD", StringComparison.OrdinalIgnoreCase))
                form = NormalizationForm.FormD;

            return = s.Normalize(form);
        }
    }
}

注意:将程序集定位到 .NET 3.5,因为 SQL Server 不支持 .NET 4.0

将程序集复制到某个位置,“创建”程序集工作正常:

CREATE ASSEMBLY CLRFunctions FROM 'c:\Program Files\My App\CLRFunctions.dll';

注意:然后开启CLR功能,否则为brokenbydefault

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

创建自定义函数失败:

CREATE FUNCTION NormalizeString(@s nvarchar(max), @normalizationForm varchar(50)) 
RETURNS nvarchar(max)
AS EXTERNAL NAME CLRFunctions.T.NormalizeString

因错误而失败:

Msg 6505, Level 16, State 2, Procedure NormalizeString, Line 1
Could not find Type 'T' in assembly 'CLRFunctions'.

为什么 SQL Server 在程序集 CLRFunctions 中找不到类型 T

注意:为什么是TCause Microsoft did.

【问题讨论】:

    标签: sql-server sql-server-2008-r2 user-defined-functions sqlclr


    【解决方案1】:

    试试

    CREATE FUNCTION NormalizeString(@s nvarchar(max), 
                                    @normalizationForm nvarchar(50)) 
    RETURNS nvarchar(max)
    AS EXTERNAL NAME CLRFunctions.[CLRFunctions.T].NormalizeString
    

    【讨论】:

    • 很好的答案 - 这让我在 SSMS 上大喊脏话。
    • 在 vs 2010 中,默认模板默认不放置命名空间,因此我的完全限定类名不正确。表示法是:RegisteredAssemblyName.[FullyQualifiedClassName].FunctionName
    • 感谢您的回答帮助了我。
    • 对于那些因使用 MSSQL 而感到筋疲力尽或感到厌烦的读者;注意括号内......那是“命名空间”“点”“类名”或者@Lemblanc正确地称之为“FullyQualifiedClassName”
    【解决方案2】:

    我刚刚在 Visual Studio 2017 中为此绞尽脑汁,在 VB 中构建了一个 CLR。 我发现,在 SQL 中创建过程时,外部名称设置如下:

    • AssemblyName.[Assemblyname.ClassNameInVBProgram].SubroutineNameInVBProgram

    它区分大小写。

    在 SQL 中使用 Create Assembly 创建 Sql 程序集

    在 SQL 中使用 Create Procedure 创建 CLR SP。

    【讨论】:

    • 效果很好如果您正在从文件创建程序集。但 Azure SQL 数据库和托管实例不允许从文件创建程序集。您必须从varbinary 创建它。看起来很简单,只是它以某种方式破坏了EXTERNAL NAME 子句的语法。在本地 托管实例 (SQL 2017) 数据库中从 varbinary 创建时,与我的本地 SQL Server 2008 R2 中的文件完全相同的语法失败。
    猜你喜欢
    • 2010-10-27
    • 2020-04-04
    • 2012-10-13
    • 1970-01-01
    • 2010-10-10
    • 2017-07-07
    • 1970-01-01
    • 2017-05-16
    • 2015-11-23
    相关资源
    最近更新 更多