SQL函数返回字符串的一部分并重命名String的一部分

时间:2016-03-31 17:44:42

标签: sql sql-server tsql

我正在尝试在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)

2 个答案:

答案 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;

结果:

enter image description here

使用的资源:

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;

enter image description here

或者你可以这样做:

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;

enter image description here

答案 1 :(得分:-1)

UPDATE YourTable SET YourColumn=REPLACE(YourColumn, 'name="FindMe"', 'Field="FindMe"') WHERE SomeCondition

假设YourColumn是varchar或nvarchar