XML数据类型方法“modify”的参数1必须是字符串文字

时间:2016-08-09 18:13:47

标签: mysql sql

我正在尝试向子节点添加属性时收到字符串文字错误。如何修改我的代码以便成功添加属性。

declare @count int=(select mxGraphXML.value('count(/mxGraphModel/root/Cell/@Value )','nvarchar') from TABLE_LIST
                      where Table_ListID=1234 )
                      declare @index int=1;
while @index<=@count
begin
declare @Value varchar(100)= @graphxml.value('(/mxGraphModel/root/Cell/@Value )[1]','nvarchar');

SET @graphxml.modify('insert attribute copyValueID {sql:variable("@Value ")}
    as first into (/mxGraphModel/root/Cell)['+convert(varchar,@index)+']');
end 
    set @index=@index+1;
end

2 个答案:

答案 0 :(得分:0)

您正在使用addition operator您应该使用CONCAT功能的位置。所以

'insert attribute copyValueID {sql:variable("@Value ")}
as first into (/mxGraphModel/root/Cell)['+convert(varchar,@index)+']'

被强迫进入一个号码。尝试:

CONCAT('insert attribute copyValueID {sql:variable("@Value ")}
as first into (/mxGraphModel/root/Cell)[',convert(varchar,@index),']')

代替。

答案 1 :(得分:0)

Adam,您可以像这样在Microsoft T-SQL中做到这一点:

declare @sql nvarchar(max)

set @sql = 'set @myxml.modify(''
    insert (
        attribute scalableFieldId {sql:variable("@sf_id")},
        attribute myTypeId {sql:variable("@my_type_id")}
    ) into (/VB/Condition/Field[@fieldId=sql:variable("@field_id")
            and @fieldCode=sql:variable("@field_code")])['+
            cast(@instance as varchar(3))+']'')'

exec sp_executesql
    @sql
   ,N'@myxml xml output, @field_code varchar(20),
      @field_id varchar(20), @sf_id int, @my_type_id tinyint'
   ,@myxml = @myxml output
   ,@field_code = @field_code
   ,@field_id = @field_id
   ,@sf_id = @sf_id
   ,@my_type_id = @my_type_id

看看我在这里做了什么?这只是动态SQL的巧妙用法,用于克服Microsoft的“字符串文字错误”的常见限制。

重要说明:是的,您可以通过在某些地方使用sql:variable()来做到这一点,但祝您好运,请尝试在方括号内的节点号限定符中使用它!如果没有设计的动态SQL,就无法做到这一点!

窍门实际上不是我的,我把头撞在墙上一会儿后,我从https://www.opinionatedgeek.com/Snaplets/Blog/Form/Item/000299/Read得到了这个主意。

如果我的样本无效或不清楚,请随时提问。