Показать сообщение отдельно
Старый 29.02.2024, 09:13   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
643 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Там еще идет функция вдовесок. В принципе не сложная, думаю.
PHP код:
CREATE FUNCTION [dbo].[PPOPeekValue](@FieldId INT, @FieldType TINYINT, @Data VARBINARY(MAX), @Position BIGINTRETURNS NVARCHAR(MAX)
AS
BEGIN
    
DECLARE @Result        NVARCHAR(MAX)
          , @
N            INT
          
, @IntValue    INT
          
, @Exp        INT
          
, @Sign        INT
          
, @FloatValue    FLOAT
          
, @Year        INT
          
, @Month        TINYINT
          
, @Day        TINYINT
          
, @BigValue    BIGINT

    
-- decode string/text values
    
IF @FieldType OR @FieldType 8
    BEGIN
        SET 
@0
        
WHILE CAST(SUBSTRING(@Data, @Position + @N2) AS SMALLINT) <> 0
            SET 
@= @2
        SET 
@Result CAST(SUBSTRING(@Data, @Position, @N) AS NVARCHAR(MAX))
    
END ELSE

    -- 
decode integer/time values
    
IF @FieldType 1
    BEGIN
        SET 
@IntValue 0
        SET 
@3
        
WHILE @>= 0
        BEGIN
            SET 
@IntValue = @IntValue 256 ASCII(SUBSTRING(@Data, @Position + @N1))
            
SET @= @1
        END
        
IF @FieldId 61441 OR @FieldId 61445
        BEGIN
            SET 
@Result CAST(dbo.PPOInt2Time(@IntValue) AS NVARCHAR(MAX));
        
END
        
ELSE
            
SET @Result CAST(@IntValue AS NVARCHAR(MAX))
    
END ELSE

      -- 
decode float values
      
IF @FieldType 2
      BEGIN
        SET 
@9
        SET 
@FloatValue 0;
        WHILE @
1
        BEGIN
            SET 
@Exp ASCII(SUBSTRING(@Data, @Position + @N1))
            
SET @FloatValue 100 * @FloatValue + (@Exp 0xF0) / 16 10 + (@Exp 0x0F)
            
SET @= @1
        END
        SET 
@Sign = CASE WHEN ASCII(SUBSTRING(@Data, @Position 11)) & 0x80 0 THEN 1 ELSE -1 END
        SET 
@Exp ASCII(SUBSTRING(@Data, @Position1))
        IF (@
Exp >= 0x80)
            
SET @Exp = @Exp 0x100
        SET 
@FloatValue = @FloatValue * @Sign POWER(CAST(10 AS FLOAT), @Exp 15)
        
SET @Result CAST(STR(@FloatValue163) AS NVARCHAR(MAX))
    
END ELSE
    
    -- 
decode date values
    
IF @FieldType 3
    BEGIN
        SET 
@Year   1900 ASCII(SUBSTRING(@Data, @Position1))
        
SET @Month  =    ASCII(SUBSTRING(@Data, @Position 11))
        
SET @Day    =    ASCII(SUBSTRING(@Data, @Position 21))
        
SET @Result CAST(@Month AS VARCHAR(2)) + '/' CAST(@Day AS VARCHAR(2)) + '/' CAST(@Year AS VARCHAR(4))
    
END ELSE

    -- 
decode enum values
    
IF @FieldType 4
    BEGIN
        SET 
@ASCII(SUBSTRING(@Data, @Position1))
        
SET @IntValue ASCII(SUBSTRING(@Data, @Position+11)) + 256 ASCII(SUBSTRING(@Data, @Position+21))
        
SELECT @Result EnumItemLabel FROM SRSAnalysisEnums AS [AE]
            
WHERE [AE].EnumId = @IntValue
              
AND [AE].EnumItemValue = @N
    END 
ELSE

    -- 
decode int64 values
    
IF @FieldType 49
    BEGIN
        SET 
@BigValue 0
        SET 
@7
        
WHILE @>= 0
        BEGIN
            SET 
@BigValue = @BigValue 256 ASCII(SUBSTRING(@Data, @Position + @N1))
            
SET @= @1
        END
        SET 
@Result CAST(@BigValue AS VARCHAR(MAX))
    
END

    
RETURN @Result
END 
__________________
// no comments