Там еще идет функция вдовесок. В принципе не сложная, думаю.
PHP код:
CREATE FUNCTION [dbo].[PPOPeekValue](@FieldId INT, @FieldType TINYINT, @Data VARBINARY(MAX), @Position BIGINT) RETURNS 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 = 0 OR @FieldType = 8
BEGIN
SET @N = 0
WHILE CAST(SUBSTRING(@Data, @Position + @N, 2) AS SMALLINT) <> 0
SET @N = @N + 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 @N = 3
WHILE @N >= 0
BEGIN
SET @IntValue = @IntValue * 256 + ASCII(SUBSTRING(@Data, @Position + @N, 1))
SET @N = @N - 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 @N = 9
SET @FloatValue = 0;
WHILE @N > 1
BEGIN
SET @Exp = ASCII(SUBSTRING(@Data, @Position + @N, 1))
SET @FloatValue = 100 * @FloatValue + (@Exp & 0xF0) / 16 * 10 + (@Exp & 0x0F)
SET @N = @N - 1
END
SET @Sign = CASE WHEN ASCII(SUBSTRING(@Data, @Position + 1, 1)) & 0x80 = 0 THEN 1 ELSE -1 END
SET @Exp = ASCII(SUBSTRING(@Data, @Position, 1))
IF (@Exp >= 0x80)
SET @Exp = @Exp - 0x100
SET @FloatValue = @FloatValue * @Sign * POWER(CAST(10 AS FLOAT), @Exp - 15)
SET @Result = CAST(STR(@FloatValue, 16, 3) AS NVARCHAR(MAX))
END ELSE
-- decode date values
IF @FieldType = 3
BEGIN
SET @Year = 1900 + ASCII(SUBSTRING(@Data, @Position, 1))
SET @Month = 1 + ASCII(SUBSTRING(@Data, @Position + 1, 1))
SET @Day = 1 + ASCII(SUBSTRING(@Data, @Position + 2, 1))
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 @N = ASCII(SUBSTRING(@Data, @Position, 1))
SET @IntValue = ASCII(SUBSTRING(@Data, @Position+1, 1)) + 256 * ASCII(SUBSTRING(@Data, @Position+2, 1))
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 @N = 7
WHILE @N >= 0
BEGIN
SET @BigValue = @BigValue * 256 + ASCII(SUBSTRING(@Data, @Position + @N, 1))
SET @N = @N - 1
END
SET @Result = CAST(@BigValue AS VARCHAR(MAX))
END
RETURN @Result
END