簡體   English   中英

XQuery [value()]:期望字符串文字

[英]XQuery [value()]: A string literal was expected

我想執行這段代碼:

if exists(select * from FileUploadFileTable..sysobjects where  xtype='u' and name='##Tmp830963'  )
        drop table  ##Tmp830963
        CREATE table  ##Tmp830963 (RowId int,Files varchar(MAX) ,Files_Name NVARCHAR(MAX), Files_Size bigint,Job_Id  bigint, Files_Type VARCHAR(MAX) , User_id bigint  ,User_Name  NVARCHAR(MAX)) Insert into ##Tmp830963(RowId,Files,Files_Name,Files_Size  , Files_Type)  select A.row_num,A.Items,O.Items,B.Items,C.Items
         from(
        SELECT Items,row_number() over (order by (select 0)) as row_num
        FROM  dbo.Func_Split('/9j/AqAAAAB4CgAwAEAAABAAAAAAA', '^') ) A
        join
        (SELECT Items,row_number() over (order by (select 0)) as row_num
        FROM  dbo.Func_Split('tt^', '^') ) O  on  O.row_num=A.row_num 
         join
        (SELECT Items,row_number() over (order by (select 0)) as row_num
        FROM  dbo.Func_Split('12^', '^'))B       on  A.row_num=B.row_num 
         join
         (SELECT Items,row_number() over (order by (select 0)) as row_num
         FROM  dbo.Func_Split('png^', '^'))C
         on   C.row_num=A.row_num 
        update  ##Tmp830963 set User_Name=100update  ##Tmp830963 set Job_Id='20' update  ##Tmp830963 set User_id='1' select * from  ##Tmp830963  DECLARE @OutputTbl TABLE (ID uniqueidentifier)    INSERT INTO [Uploads]  ([file_stream],[name])  OUTPUT INSERTED.stream_id INTO @OutputTbl(ID)  select cast(N'' as xml).value('xs:base64Binary(sql:variable(Files))', 'varbinary(max)') ,Files_Name   from ##Tmp830963 while (select count(*)  from @OutputTbl) > 0 begin INSERT INTO [dbo].[FileDescriptions]  ([User_ID] ,[FileName],Stream_id,[Size],Job_Id)   select   [User_id] ,cast((select MAX(ID) from @OutputTbl   )  as nvarchar(max) ),(select MAX(ID) from @OutputTbl) , Files_Size  ,  Job_Id   from ##Tmp830963  where RowId=(select top 1(RowId) from ##Tmp830963)  delete @OutputTbl  where ID =(select MAX(ID) from @OutputTbl )  end 

但我得到這個錯誤:

XQuery [value()]:期望字符串文字

在這一行:

 cast(N'''' as xml).value(''xs:base64Binary(sql:variable(Files))'' 

乍一看,這看起來有點奇怪。 我很確定,這可以用不同的方式解決。

您正在嘗試將base64轉移到varbinary ,對嗎?
嗯,XML方法是實現這一目標的推薦方法。 但是,您的問題似乎位於此處:

cast(N'''' as xml).value(''xs:base64Binary(sql:variable(Files))''

這是您嘗試動態創建所需語句,因此加倍單引號。 這將轉化為

cast(N'' as xml).value('xs:base64Binary(sql:variable(Files))'

這里的問題是: sql:variable()期望聲明的變量的名稱為字符串文字。 此外, value()需要兩個參數: Xpath和數據類型。 你需要這樣的東西

cast(N'' as xml).value('sql:variable("@Files")','varbinary(max)')

你可能需要sql:column("SomeColumn") ,它允許使用列的值。

一個例子來證明這一點

--We use FOR XML to get the binary 0x1234 as base64
SELECT 0x1234 FOR XML PATH(''); --returns "EjQ="

--Now I place the corresponding base64 string in a string variable 
DECLARE @base64 VARCHAR(100)='EjQ=';

--And this is, how XML is returning the binary 0x1234 from the base64-string
SELECT CAST('' AS XML).value('sql:variable("@base64")','varbinary(max)');

而這將返回相同,看起來更容易一些:

SELECT CAST(@base64 AS XML).value('.','varbinary(max)');

檢查這是一個表格方法

@base64是聲明的表變量,只需使用原始表:

--Declare a table variable with one string column and insert the base64 of 0x1234
DECLARE @base64 TABLE(Files VARCHAR(100));
INSERT INTO @base64 VALUES('EjQ=');

--use the same trick as above to get the varbinary back
SELECT CAST(Files AS XML).value('.','varbinary(max)')
FROM @base64;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM