【问题标题】:Writing this C# function in T-SQL用 T-SQL 编写这个 C# 函数
【发布时间】:2021-12-14 07:17:50
【问题描述】:

这是解压缩 BLOB 文件的 code 的一部分(从 varbinary 列中删除前 4 个二进制数):

在 C# 中:

Stream bStream = sqlBytes.Stream;
byte[] bytes = new byte[bStream.Length];
Encoding Rus = Encoding.GetEncoding("windows-1251");

byte[] bytesOffset = new byte[bytes.Length - 4];
Buffer.BlockCopy(bytes, 4, bytesOffset, 0, bytes.Length - 4);

MemoryStream inStream = new MemoryStream(bytesOffset);

DeflateStream decompressionStream = new DeflateStream(inStream, CompressionMode.Decompress);

MemoryStream outStream = new MemoryStream();
decompressionStream.CopyTo(outStream);

str = Rus.GetString(outStream.ToArray());

如何在 T-SQL (SQL Server) 中复制它?

DECLARE @OneByte binary(1)

WHILE @current_pos <= DATALENGTH(@sqlBinary)
BEGIN  
    IF @current_pos > 4 
    BEGIN
        SET @OneByte = SUBSTRING(@sqlBinary, @current_pos, 1);

        SET @current_pos = @current_pos + 1;
    END

    RETURN CONVERT(varchar(max), CONVERT(varbinary(max), @sqlBinary))

【问题讨论】:

  • 我可以问你为什么要使用一种不是为这些事情而构建的语言吗?
  • 即使我不是系统管理员也能使用这个功能。我只是 dbowner,所以我无法安装 dll。
  • 你能举个例子吗?您希望 0x6700 变成 0x0700 是否正确?
  • 0x6700 转换后为“g”

标签: c# sql sql-server tsql blob


【解决方案1】:

您可以使用SUBSTRINGDECOMPRESS 的组合来执行此操作。

注意COMPRESSDECOMPRESS使用GZip,你不能改变算法。

DECLARE @str varchar(100)='hello';

DECLARE @sqlBinary varbinary(1000) = 0X12345678 + COMPRESS(@str);

SELECT CAST(DECOMPRESS(
  SUBSTRING(@sqlBinary, 5, LEN(@sqlBinary))
) AS varchar(100));
Result
hello

db<>fiddle

在您的情况下,您可以将列值转换为 varbinary(max)

SELECT
  CAST(
    DECOMPRESS(
      SUBSTRING(
        CAST(YourImageColumn AS varbinary(max)),
        5,
        DATALENGTH(YourImageColumn)
      )
    ) AS varchar(max)
  )
FROM YourTable;

【讨论】:

  • 我需要在“压缩”的 BLOB 类型 -> 图像上使用此功能。就我而言,幻数是 0x01447C5A。那我应该如何使用 SUBSTRING 呢?第三个参数应该是 LEN(@sqlBinary) - 第二个参数对吗?但是第二个参数是什么?
  • 5 因为您正在跳过前 4 个字节。对于image,只需先转换为varbinary(max)
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多