Мне удалось выяснить, как извлечь это из базы данных благодаря информации, предоставленной @Alex Kwitny. Получив имя перечисления, я смог найти его в таблице ModelElement и связать его с таблицей ModelElementData по значению ElementHandle. Таблица ModelElementData имеет поле Properties, хранящееся в varbinary, которое можно разбить на части, чтобы прочитать значения для каждого целочисленного значения в основной базе данных. Мне потребовалось некоторое время, чтобы разобрать все и преобразовать двоичный файл в текст, но теперь я могу просто ссылаться на значения enum на случай, если что-нибудь изменится в будущем, превратив свой запрос в функцию, которую можно вызывать из основного запроса в моем отчет.
DECLARE @name AS VARCHAR(40) = 'BatchStatus'
, @value AS INT = 1
, @language AS VARCHAR(8) = 'en_us';
DECLARE @bin AS VARBINARY(MAX);
SET @bin =
(
SELECT TOP (1)
med.[Properties]
FROM [MicrosoftDynamicsAX_Model].[dbo].[ModelElement] me
INNER JOIN [MicrosoftDynamicsAX_Model].[dbo].[ModelElementData] med
ON med.[ElementHandle] = me.[ElementHandle]
WHERE me.[Name] = @name
AND me.[ElementType] = 40
ORDER BY med.[LayerId] DESC
);
DECLARE @pos AS INT;
DECLARE @flags AS INT;
DECLARE @count AS INT;
DECLARE @idx AS INT;
DECLARE @off AS INT;
DECLARE @result AS VARCHAR(255);
SET @pos = 3;
SET @off = CAST(SUBSTRING(@bin, @pos, 1) AS INT) - 1;
SET @pos = @pos + 1;
WHILE @off > 0
BEGIN
WHILE SUBSTRING(@bin, @pos, 2) <> 0x0000
SET @pos = @pos + 2;
SET @pos = @pos + 2;
SET @off = @off - 1;
END;
SET @flags = CAST(SUBSTRING(@bin, @pos, 3) AS INT);
SET @pos = @pos + 3;
IF @flags & 0x008000 = 0x008000
BEGIN
WHILE SUBSTRING(@bin, @pos, 2) <> 0x0000
SET @pos = @pos + 2;
SET @pos = @pos + 2;
END;
IF @flags & 0x000002 = 0x000002
SET @pos = @pos + 1;
SET @pos = @pos + 1;
SET @count = CAST(SUBSTRING(@bin, @pos, 1) AS INT);
IF @count > 0
BEGIN
SET @pos = @pos + 1;
IF @flags & 0x000200 = 0x000200
SET @idx = @value;
ELSE
BEGIN
SET @idx = 0;
SET @off = 2 + CAST(CAST(REVERSE(SUBSTRING(@bin, @pos, 2)) AS BINARY(2)) AS INT) * 2;
SET @off = @off + 2 + CAST(CAST(REVERSE(SUBSTRING(@bin, @pos + @off, 2)) AS BINARY(2)) AS INT) * 2;
WHILE CAST(SUBSTRING(@bin, @pos + @off + @idx, 1) AS INT) <> @value
AND @idx < @count
SET @idx = @idx + 1;
IF CAST(SUBSTRING(@bin, @pos + @off + @idx, 1) AS INT) <> @value
SET @idx = -1;
END;
IF @idx >= 0
BEGIN
SET @pos = @pos + 2;
WHILE 1 = 1
BEGIN
SET @off = 0;
SET @result = '';
WHILE SUBSTRING(@bin, @pos + @off, 2) <> 0x0000
BEGIN
SET @result = @result + CHAR(CAST(REVERSE(SUBSTRING(@bin, @pos + @off, 2)) AS BINARY(2)));
SET @off = @off + 2;
END;
SET @pos = @pos + @off + 2;
IF @idx <= 0
BREAK;
SET @idx = @idx - 1;
END;
END;
ELSE
SET @result = '~ENUM NOT FOUND~';
END;
ELSE
SET @result = '~ERROR~';
IF SUBSTRING(@result, 1, 1) = '@'
BEGIN
DECLARE @module AS VARCHAR(3);
DECLARE @label AS INT;
SET @module = SUBSTRING(@result, 2, 3);
SET @label = CAST(SUBSTRING(@result, 5, DATALENGTH(@result) - 4) AS INT);
SET @result =
(
SELECT TOP (1)
[Text]
FROM [MicrosoftDynamicsAX_Model].[dbo].[ModelElementLabel]
WHERE [LabelId] = @label
AND [Module] = @module
AND [Language] = @language
ORDER BY [LayerId] DESC
);
END;
SELECT @value AS [Id]
, @result AS [Status];