Получение данных внутри процедуры CLR с другого сервера - PullRequest
0 голосов
/ 21 мая 2018

У меня есть процедура CLR, которая открывает соединение с сервером, скажем, SERVER2, и получает некоторые данные, обрабатывает их и возвращает таблицу.

[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 запускается из хранимой SQLПроцедура, которая выполняется на SERVER1.

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." В окне результатов эта ошибка появляется несколько раз, я думаю, один раз для каждого цикла в FETCH.

1 Ответ

0 голосов
/ 21 мая 2018

Выполнение INSERT...SELECT должно привести к сгенерированной системой Транзакции для связывания INSERT и SELECT вместе в качестве атомарной операции.Поведение по умолчанию SqlConnection, начиная с версии .NET 4.0 или 4.5, для Enlist равно True, тогда как в предыдущих версиях .NET Framework по умолчанию оно было False.Если Enlist равно True, новое соединение будет пытаться присоединиться к существующей транзакции.

Попробуйте добавить Enlist=False; в строку соединения.

Для получения дополнительной информации о работе с SQLCLR вВообще, пожалуйста, посетите SQLCLR.org .

...