我正在尝试在SQL中运行一个查询,只返回一列字符串。
字符串本身包含许多字符,但我只想返回以下内容:
名称= “ABCD”
示例字符串,它只是一行乱码的XML代码。
<Help><field id="123" type="0" name="CTRLID" formatstring=""><oldValue> <![CD[1234]]></oldValue><newValue><![CD[12345]></newValue></field><field id="123456" type="5" name="SearchMe" formatstring <setChoice>123456789</setChoice></field></Help>
以上只是一行中的一个字符串。
我希望name="CTRLID"
返回,name="SearchMe"
仅返回。最后,我想将name
更改为Field
。我要搜索的列称为MD。
可以使用哪些功能来执行这些操作以及我需要遵循哪些操作?
示例:SUBSTRING([MD],44,600)
答案 0 :(得分:0)
杰夫,所以你有XML:
<Help>
<field id="123" type="0" name="CTRLID" formatstring="">
<oldValue>
<![CD[1234]]>
</oldValue>
<newValue>
<![CD[12345]>
</newValue>
</field>
<field id="123456" type="5" name="SearchMe" formatstring="">
<setChoice>123456789</setChoice>
</field>
</Help>
然而,sql server似乎不喜欢<![CD[1234]]>
并且更喜欢<![CDATA[1234]]>
您可以在我的解决方案中看到我更改了数据,以便将CDATA写为<![CDATA[1234]]>
但基本上你需要做类似以下的事情:
的假设:
列中的数据是XML数据类型
QUERY:
DECLARE @XML XML = '<Help>
<field id="123" type="0" name="CTRLID" formatstring="">
<oldValue>
<![CDATA[1234]]>
</oldValue>
<newValue>
<![CDATA[12345]]>
</newValue>
</field>
<field id="123456" type="5" name="SearchMe" formatstring="">
<setChoice>123456789</setChoice>
</field>
</Help>';
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
DROP TABLE #TEMP;
SELECT T.c.query
('.') AS Field
INTO #TEMP
FROM @XML.nodes
('/Help/field') T(c);
SELECT Field.value('(/field/@name)[1]', 'varchar(100)') as [Field]
FROM #TEMP;
结果:
使用的资源:
nodes() Method (xml Data Type)
希望有所帮助
回应评论:
DECLARE @STRING VARCHAR(MAX) = '<Help>
<field id="123" type="0" name="CTRLID" formatstring="">
<oldValue>
<![CD[1234]]>
</oldValue>
<newValue>
<![CD[12345]]>
</newValue>
</field>
<field id="123456" type="5" name="SearchMe" formatstring="">
<setChoice>123456789</setChoice>
</field>
</Help>';
DECLARE @XML XML;
SELECT @XML=CAST( REPLACE (@STRING,'<![CD[','<![CDATA[') AS XML)
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
DROP TABLE #TEMP;
SELECT T.c.query
('.') AS name
INTO #TEMP
FROM @XML.nodes
('/Help/field') T(c);
SELECT name.value('(/field/@name)[1]', 'varchar(100)') as [name]
FROM #TEMP
FOR XML RAW;
或者你可以这样做:
DECLARE @STRING VARCHAR(MAX) = '<Help>
<field id="123" type="0" name="CTRLID" formatstring="">
<oldValue>
<![CD[1234]]>
</oldValue>
<newValue>
<![CD[12345]]>
</newValue>
</field>
<field id="123456" type="5" name="SearchMe" formatstring="">
<setChoice>123456789</setChoice>
</field>
</Help>';
DECLARE @XML XML;
SELECT @XML=CAST( REPLACE (@STRING,'<![CD[','<![CDATA[') AS XML)
IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL
DROP TABLE #TEMP;
SELECT T.c.query
('.') AS Field
INTO #TEMP
FROM @XML.nodes
('/Help/field') T(c);
SELECT 'name="'+Field.value('(/field/@name)[1]', 'varchar(100)')+'"' as [Field]
FROM #TEMP;
答案 1 :(得分:-1)
UPDATE YourTable SET YourColumn=REPLACE(YourColumn, 'name="FindMe"', 'Field="FindMe"') WHERE SomeCondition
假设YourColumn是varchar或nvarchar