在 base64 中编码和解码 XML 个字符串

Encode and decode XML strings in base64

我刚找到一份主要使用 SQL Server 2016 (v13.0.5) 的工作。

我正在处理的任务是获取一列 XML 当前以 base64 编码的字符串,并找到一种方法对其进行解码、更改并通过直接 SQL 或存储过程之类的东西——因为我们主要在 Report Builder 中使用这些数据制作表格,而不与 Web 脚本或其他程序连接,为此使用 SQL 以外的其他东西(Python被建议)会在系统中添加一个额外的齿轮,这是不受欢迎的。所以请不要为难我寻找这个,我知道它不是最优的。

我看过这里的其他几篇文章。 Microsoft SQL 2016 decode Base64 column gives me a column full of nulls. This other one Base64 encoding in SQL Server 2005 T-SQL 中作为解决方案提供的编码函数用于转换单个字符串,而且我似乎对 SQL 没有足够的经验来尝试将其嵌入到存储过程或其他东西中一次通过列一个值。这是我最后一次尝试,但没有任何改变。

SET NOCOUNT ON;  

DECLARE @xmlvalue varchar(200)

DECLARE pruebacursor CURSOR FOR
    SELECT xmlvalue FROM base64pruebas

OPEN pruebacursor

FETCH NEXT FROM pruebacursor INTO @xmlvalue

WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE base64pruebas 
    SET XMLValue = (CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@xmlvalue"))', 'VARCHAR(MAX)'))
    WHERE xmlvalue = @xmlvalue

    FETCH NEXT FROM pruebacursor INTO @xmlvalue
END

CLOSE pruebacursor;
DEALLOCATE pruebacursor;

到此结束时,有问题的列仍然与我开始时相同。

感谢您就如何改进此问题提出任何建议。

您尝试使用的 xs:base64Binary() 技巧需要 varbinary(max) 源数据才能生成 base64 编码输出。您的示例代码中的游标循环也是不必要的。

尝试这样的事情...

--
-- Setup example data...
--
create table dbo.base64pruebas (
  xmlvalue varchar(max)
);

insert dbo.base64pruebas (xmlvalue) values
  (N'<?xml version="1.0" encoding="utf-16"?><rptsett xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" n="name"><rpts></rpts></rptsett>');

--
-- Base64 encode the "xml" data...
--
update base
set xmlvalue = cast('' as xml).value('xs:base64Binary(sql:column("binaryValue"))', 'varchar(max)')
from dbo.base64pruebas base
outer apply (
  select [binaryValue] = cast(xmlvalue as varbinary(max))
) as conv;

--
-- Display the results...
--
select * from dbo.base64pruebas;

产生输出...

xmlvalue
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+PHJwdHNldHQgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgbj0ibmFtZSI+PHJwdHM+PC9ycHRzPjwvcnB0c2V0dD4=