我的同事在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
答案 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,问题似乎就得到了解决。