|
![]() |
#1 |
Участник
|
Добрый вечер, уважаемые коллеги.
Разобрался с этой темой, но не до конца. В хранимой процедуре обращаюсь к другой БД, извлекаю из нее данные, читаю в 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 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 Может кто-нибудь подсказать, как мне использовать временные таблицы на стороне SQL Server, чтобы можно было нормально прочитать выборку в AX? P.S. Спешу напомнить, что мне обязательно нужно обратиться к другой базе, поэтому использую хранимые процедуры.
__________________
// no comments Последний раз редактировалось dech; 08.08.2013 в 18:47. |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от dech
![]() Но стоит только настроить процедуру на работу с временными таблицами, как возникает ошибка такого рода: SQL error description: [Microsoft][ODBC SQL Server Driver]Invalid cursor state
Вот текст процедуры, использующей временную таблицу: X++: BEGIN SET NOCOUNT ON (...) SET NOCOUNT OFF (...) END Может кто-нибудь подсказать, как мне использовать временные таблицы на стороне SQL Server, чтобы можно было нормально прочитать выборку в AX? Вы сами спровоцировали ошибку снова включив ее перед выполнением служебной команды DROP TABLE. Т.е. завершающая команда DROP TABLE #TempCustTable при настройке SET NOCOUNT OFF привела к формированию некоего "мусора" который и вызвал ошибку ODBC. PS: Правилом хорошего тона считается предварительно проверить факт существования таблицы как перед ее созданием, так и перед ее удалением. Т.е. обычно пишут так X++: begin SET NOCOUNT ON if object_id('Tempdb..#TempCustTable') is not null DROP TABLE #TempCustTable create table #TempCustTable (...) insert ... select ... if object_id('Tempdb..#TempCustTable') is not null DROP TABLE #TempCustTable end
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
![]() |
||||
Тема | Ответов | |||
dynamicsaxbi: Better together: Microsoft Dynamics AX 2012 R2 and SQL Server Power View | 0 | |||
Connection к другому SQL Server | 5 |
|