Показать сообщение отдельно
Старый 08.08.2013, 18:44   #22  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Добрый вечер, уважаемые коллеги.
Разобрался с этой темой, но не до конца. В хранимой процедуре обращаюсь к другой БД, извлекаю из нее данные, читаю в AX следующим методом:
X++:
public static server void testExport()
{
    Connection          conn;
    Statement           stmt;
    str                 expr = "EXEC [dbo].[usp_DenisTest]";
    ResultSet           rs;
    SqlStatementExecutePermission   perm = new SqlStatementExecutePermission(expr);
    ;

    conn = new Connection();

    perm.assert();

    stmt = conn.createStatement();

    // BP deviation documented
    rs = stmt.executeQuery(expr);

    while (rs.next())
    {
        info(rs.getString(1));
    }

    rs.close();

    CodeAccessPermission::revertAssert();
}
Текст хранимой процедуры - следующий:
X++:
USE [PRD]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_DenisTest]
AS
BEGIN
SELECT ProdId, WrkCtrId, ItemId FROM [CSF_PRD].[dbo].[SFMatl] AS SFMatl
WHERE SFMatl.CompanyId = 'dat'
  AND SFMatl.WrkCtrId = 'E01'
  AND SFMatl.PrOdId = 'W000004'

END
Главное - проставить в SQL Server разрешения на запуск нужной SP для AOS-аккаунта. Все отлично работает.
Но стоит только настроить процедуру на работу с временными таблицами, как возникает ошибка такого рода: SQL error description: [Microsoft][ODBC SQL Server Driver]Invalid cursor state
Вот текст процедуры, использующей временную таблицу:
X++:
USE [PRD]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_DenisTest2]
AS
BEGIN

SET NOCOUNT ON

CREATE TABLE #TempCustTable (
        AccountNum varchar(10) COLLATE Latin1_General_CI_AI
      , CustName varchar(50) COLLATE Latin1_General_CI_AI
)

INSERT INTO #TempCustTable (AccountNum, CustName)
SELECT AccountNum, Name FROM CustTable
WHERE CustTable.DataAreaId = 'dat'
  AND CustTable.Name LIKE 'S%'
  
SET NOCOUNT OFF

SELECT * FROM #TempCustTable

DROP TABLE #TempCustTable

END
Также пробовал менять SET NOCOUNT, но как видите, особого результата не добился.
Может кто-нибудь подсказать, как мне использовать временные таблицы на стороне SQL Server, чтобы можно было нормально прочитать выборку в AX?
P.S. Спешу напомнить, что мне обязательно нужно обратиться к другой базе, поэтому использую хранимые процедуры.
__________________
// no comments

Последний раз редактировалось dech; 08.08.2013 в 18:47.