SQL Server文本字段转换错误和Base64解码

时间:2014-03-11 16:58:33

标签: sql sql-server casting

DP.Docpage是HTML文档Base64encoded的SQL Server中的文本字段。

VGVzdERhdGE=
is the base64 encoding of text
TextData

我将它用作健全性检查,以查看我们在T-SQL中的Base64编码是否正常工作。

场景#1:

,CAST(CAST(N'' AS XML).value('xs:base64Binary("VGVzdERhdGE=")', 'VARBINARY(MAX)') AS VARCHAR(MAX)) ASCIIEncoding

很好地编写了所有硬编码的内容。

场景#2:

,CAST(CAST(N'' AS XML).value('xs:base64Binary(DP.DocPage)', 'VARCHAR(MAX)') AS VARCHAR(MAX)) ASCIIEncoding

产生错误:

  

XQuery [value()]:无法从'xdt:untypedAtomic *'显式转换为'xs:base64Binary'

场景#3:

,CAST(CAST(N'' AS XML).value('xs:base64Binary(' + Convert(varbinary,Dp.DocPage) + ')', 'VARBINARY(MAX)') AS VARCHAR(MAX)) ASCIIEncoding

产生错误:

  

不允许从数据类型文本到varbinary的显式转换。

2 个答案:

答案 0 :(得分:1)

测试的两个问题:

  1. 您需要使用“sql:column()”功能才能引用查询中的列
  2. 您正在使用VARCHAR(MAX)而不是VARBINARY(MAX)作为带有实列的测试中value()函数的XML输出类型。
  3. 关于TEXT数据类型字段的问题,您可以在派生表中执行SELECT *时将其转换为VARCHAR(MAX),允许您在XML中引用转换后的值,前提是sql:column( )函数需要字符串文字字段名称,不接受表达式。

    以下工作(请注意,临时表仅用于示例目的,只需将临时表引用替换为真实表):

    -- DROP TABLE #DocPages
    -- DROP TABLE #JoinTable
    CREATE TABLE #DocPages (DocPageID INT NOT NULL, DocPage [TEXT])
    CREATE TABLE #JoinTable (ID INT NOT NULL, DocPageID INT NOT NULL)
    
    INSERT INTO #DocPages (DocPageID, DocPage) VALUES (1, 'VGVzdERhdGE=')
    INSERT INTO #DocPages (DocPageID, DocPage) VALUES (23, 'VGhpcyBpcyBhIHRlc3Q=')
    INSERT INTO #JoinTable (ID, DocPageID) VALUES (768753, 1)
    INSERT INTO #JoinTable (ID, DocPageID) VALUES (555, 23)
    
    SELECT  DP.DocPageID,
      CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:column("DP.DocPageVarChar"))',
               'VARBINARY(MAX)') AS VARCHAR(MAX)) AS [ASCIIEncoding]
    FROM (SELECT *, CONVERT(VARCHAR(MAX), doc.DocPage) AS [DocPageVarChar]
          FROM #DocPages doc) DP
    INNER JOIN #JoinTable JT
            ON JT.DocPageID = DP.DocPageID
    

    输出:

      

    DocPageID ASCIIEncoding
      1 TestData
      23这是一个测试

答案 1 :(得分:0)

Drop Table #UmbracoDocs;

选择     DP.DocPageID为UmbracoDocs_ID     ,转换(Varchar(max),DP.DocPage)AS HtmlPage     ,D.Createdby_PersID As Person_ID     ,N.NavURL     ,N.NavLabel     ,D.OriginSite_ID

INTO #UmbracoDocs

from DocPages DP

inner join Documents D on DP.DocPageId=D.DocId

inner join NavSystems NS on D.OriginSite_ID=NS.OriginSite_ID

inner join Navigation N on NS.NavSysID=N.NavSys_ID;

- 从#UmbracoDocs

中选择*

选择     UmbracoDocs_ID     ,HtmlPage     ,CAST(CAST(N''AS XML).value('xs:base64Binary(sql:column(“#UmbracoDocs.HtmlPage”))','VARBINARY(MAX)')AS VARCHAR(MAX))ASCIIEncoding     ,PERSON_ID     ,NavURL     ,NavLabel     ,OriginSite_ID

From #UmbracoDocs