SQL Server 2005 CLR函数System.NullReferenceException:未将对象引用设置为对象的实例

时间:2012-02-06 19:20:00

标签: sql-server-2005

我的同事在VB.NET中编写了一个包来操作字符串。我被要求通过CLR实施它们。该包访问与部署的CLR dll文件在同一服务器上的参考数据库,以标准化字符串。我将包导入到我的CLR代码中,以便为SQL Server创建函数。

将dll文件部署到sql server之后,这些函数运行正常,但偶尔会出现错误

System.NullReferenceException: Object reference not set to an instance of an object.

我必须多次执行我的查询才能使其正常工作。桌子似乎已锁定或正在睡觉。我的查询就像

SELECT EMAIL_ADDRESS,dbo.ufn_getEmailDomain(Email_Address) AS EDOMAIN FROM < / em> CONTACT_TEMP          WHERE Email_Address不为空且Email_Address&lt;&gt;''

dbo.ufn_getEmailDomain是CLR功能。

根本无法在线访问此服务器。我搜索了一段时间,无法找到为什么偶尔出现这个错误或如何解决它。

非常感谢您的反馈。

我的CLR在这里发挥作用。

<Microsoft.SqlServer.Server.SqlFunction(DataAccess:=DataAccessKind.Read)> _
Public Shared Function ufn_getEmailDomainSLD(ByVal email As String) As String

    If email Is Nothing Then
        Return Nothing
    End If

    Dim de As New DataEmail(email)
    Dim dm As New DataDomain
    Dim emailDomain As String
    dm = de.Domain

    emailDomain = dm.SLD

    Return emailDomain
End Function

2 个答案:

答案 0 :(得分:0)

如果我理解正确 - 函数从电子邮件字符串返回域名。

尝试以这种方式获取它(如果没有milti-mail字符串值)

SELECT 
  EMAIL_ADDRESS, 
  SUBSTRING(EMAIL_ADDRESS, CHARINDEX('@', Item)+1, 2147483647) AS EDOMAIN 
FROM CONTACT_TEMP 
WHERE Email_Address IS NOT NULL AND Email_Address<>'' 

- 在您的clr代码中找到您的错误。尝试使用选项RETURNS NULL ON NULL INPUT重新创建函数。如果没有帮助 - 那么您需要查看并清理您的CLR代码。

答案 1 :(得分:0)

我最终找到了原因。在CLR代码的连接字符串中,我应该设置ENLIST = FALSE,因为它连接到不同的数据库。一旦我设置ENLIST = FALSE,问题似乎就得到了解决。