【发布时间】:2015-01-29 18:36:06
【问题描述】:
我在带有 .NET 4.5 的 SQL Server 2012 和 Visual Studio 2012 上运行,尝试构建一个 CLR 函数,该函数创建一个表并使用上下文连接将结果插入其中。
我收到了错误:
RunFetchXML 中发生错误:在此上下文中不允许数据访问。上下文要么是未使用 DataAccessKind.Read 或 SystemDataAccessKind.Read 标记的函数或方法,要么是从表值函数的 FillRow 方法获取数据的回调,要么是 UDT 验证方法。
更新: 我能够克服上面的错误,我发现在我添加 DataAccessKind.Read 属性后程序集没有按预期更新,所以在更新后我再次尝试并收到此错误:
An error occurred in RunFetchXML: Invalid use of a side-effecting operator 'CREATE TABLE' within a function.
我正在尝试设置一个将FetchXML 作为输入字符串的 CLR 函数,CLR 函数将需要使用该FetchXML 并查询外部系统,然后创建一个表并转储结果进去。我不认为我可以将表值函数与FillRow 等一起使用,因为我需要能够处理FetchXML 中定义的任何内容,这意味着最终结果可以是任何东西,它不是固定数据结构。
所以我想做的是从 CLR 内部使用当前上下文连接回 SQL Server,创建一个支持 FetchXML 返回的字段的表,然后将查询结果转储到表中。
我在尝试这个时遇到了上述错误,我不确定这是否可能,任何帮助或建议将不胜感激。
这是我当前的 CLR 函数代码,这被简化为只是尝试创建一个空表,并返回一个带有“成功”或错误消息的字符串结果,这就是我得到上述错误的地方来自:
Imports System.Data
Imports System.Data.SqlTypes
Imports System.Data.Sql
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient
Public Class Retrieve
<SqlFunction(DataAccess:=DataAccessKind.Read)> _
Public Shared Function RunFetchXML(pstrFetchXML As SqlString) As SqlString
Dim lstrResult As SqlString
Try
Using lsqlConn As New SqlConnection("context connection=true")
lsqlConn.Open()
Using lsqlCmd As New SqlCommand("CREATE TABLE #test (vchField1 varchar(200), iField2 int)", lsqlConn)
lsqlCmd.CommandType = CommandType.Text
lsqlCmd.ExecuteNonQuery()
End Using
End Using
lstrResult = "Success"
Catch ex As Exception
lstrResult = "An error occurred in RunFetchXML: " + ex.Message
End Try
Return lstrResult
End Function
End Class
这是我用来注册的 SQL 命令的相关部分:
CREATE ASSEMBLY [TestAssembly]
FROM 'C:\Mssql\CLR\TestAssembly.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE FUNCTION RunFetchXML(@pstrFetchXML nvarchar(MAX)) RETURNS nvarchar(MAX)
AS
EXTERNAL NAME TestAssembly.[TestAssembly.Retrieve].RunFetchXML
GO
Grant Execute on RunFetchXML TO Public;
我运行这个命令来测试它并得到错误信息作为返回值:
DECLARE @vchOutput nvarchar(MAX)
EXEC @vchOutput = dbo.RunFetchXML['test']
SELECT @vchOutput
我只是在这里遗漏了一些东西,还是无法从 CLR 函数写入(创建表并插入)?
【问题讨论】:
标签: .net sql-server sqlclr