从不同的服务器获取 CLR Procedure 中的数据
Getting data inside CLR Procedure from different server
我有一个 CLR 过程,它打开到服务器的连接,比方说 SERVER2,并获取一些数据,处理它并 returns table。
[SqlFunction(
DataAccess = DataAccessKind.Read,
FillRowMethodName = "List_FillRow",
TableDefinition = "Date datetime, Quantity int")]
public static IEnumerable ListCount(...)
{
using (SqlConnection con = new SqlConnection(connectionStringToSERVER2))
{ ... }
return list;
}
此 CLR 过程 运行 来自 SERVER1 上 运行 的 SQL 存储过程。
CREATE PROCEDURE [dbo].[sp_Reports_NumaraSpalariJetWash]
BEGIN
DECLARE curs CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT ...
OPEN curs
FETCH NEXT FROM curs
INTO ...;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO ...
(...)
SELECT Date, Quantity
FROM dbo.ListCount(...)
FETCH NEXT FROM curs
INTO ...;
END
END
我收到错误:"System.Data.SqlClient.SqlException: Transaction context in use by another session."
结果 window 这个错误出现多次,我想每次进入 FETCH 循环都会出现一次。
执行 INSERT...SELECT
应该会导致系统生成的事务将 INSERT
和 SELECT
绑定在一起作为原子操作。从 .NET 4.0 或 4.5 开始,SqlConnection
的默认行为是 Enlist
为 True
,而在 .NET Framework 的早期版本中它默认为 False
。当 Enlist
为 True
时,新连接将尝试加入现有事务。
尝试将 Enlist=False;
添加到连接字符串。
有关一般使用 SQLCLR 的更多信息,请访问 SQLCLR.org。
我有一个 CLR 过程,它打开到服务器的连接,比方说 SERVER2,并获取一些数据,处理它并 returns table。
[SqlFunction(
DataAccess = DataAccessKind.Read,
FillRowMethodName = "List_FillRow",
TableDefinition = "Date datetime, Quantity int")]
public static IEnumerable ListCount(...)
{
using (SqlConnection con = new SqlConnection(connectionStringToSERVER2))
{ ... }
return list;
}
此 CLR 过程 运行 来自 SERVER1 上 运行 的 SQL 存储过程。
CREATE PROCEDURE [dbo].[sp_Reports_NumaraSpalariJetWash]
BEGIN
DECLARE curs CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT ...
OPEN curs
FETCH NEXT FROM curs
INTO ...;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO ...
(...)
SELECT Date, Quantity
FROM dbo.ListCount(...)
FETCH NEXT FROM curs
INTO ...;
END
END
我收到错误:"System.Data.SqlClient.SqlException: Transaction context in use by another session."
结果 window 这个错误出现多次,我想每次进入 FETCH 循环都会出现一次。
执行 INSERT...SELECT
应该会导致系统生成的事务将 INSERT
和 SELECT
绑定在一起作为原子操作。从 .NET 4.0 或 4.5 开始,SqlConnection
的默认行为是 Enlist
为 True
,而在 .NET Framework 的早期版本中它默认为 False
。当 Enlist
为 True
时,新连接将尝试加入现有事务。
尝试将 Enlist=False;
添加到连接字符串。
有关一般使用 SQLCLR 的更多信息,请访问 SQLCLR.org。