mssql(tsql)程序更换订单

mssql(tsql)程序更换订单,tsql,sql-server-2008,Tsql,Sql Server 2008,我想换成 ... <td class="m92_t_col5" id="preis_0">xx</td> ... 所以id=必须是第一个,然后是class=。这可能与tsql有关吗?id或类中的文本是通用的…我需要找到一些soap,但鉴于您的要求,这是一个如何实现所需替换的示例 ... <td id="preis_0" class="m92_t_col5">xxx</td> ... 输入 输出 <td class="m92_t_col5"

我想换成

...
<td class="m92_t_col5" id="preis_0">xx</td>
...

所以id=必须是第一个,然后是class=。这可能与tsql有关吗?id或类中的文本是通用的…

我需要找到一些soap,但鉴于您的要求,这是一个如何实现所需替换的示例

...
<td id="preis_0" class="m92_t_col5">xxx</td>
...
输入

输出

<td class="m92_t_col5" id="preis_0">xx</td>
<td id="preis_2" class="m29_t_col5">no fix req</td>
<td id="preis_49" class="m29_t_col5">no fix req</td>
<td  class="m93_t_col50" id="preis_3">xy</td>
<td      class="m95_t_col5" style="fuzzy" id="preis_5">xz</td>
<td id="preis_8" class="m29_t_col5">no fix req</td>
在做了一些思考之后,您可能一直在尝试将其作为标量函数。这可能会有更糟糕的性能,但它解决了问题

<td id="preis_0" class="m92_t_col5">xx</td>
<td id="preis_2" class="m29_t_col5">no fix req</td>
<td id="preis_49" class="m29_t_col5">no fix req</td>
<td  id="preis_3" class="m93_t_col50">xy</td>
<td      id="preis_5" style="fuzzy" class="m95_t_col5">xz</td>
<td id="preis_8" class="m29_t_col5">no fix req</td>
用法


你能解释一下你想要达到的目标吗?为什么需要更改这些属性的顺序?因为我正在解析一些数据,并且需要id=class=在客户机代码中对这类内容进行调整要比在sql中容易得多,尤其是在这里,您有html。去找一个真正的html解析器在你的应用程序中使用。如果您的代码关心顺序,那么您就错了。嗯,但是客户端代码比sql代码慢得多?对于可以使用索引的基于集合的操作,客户端代码比sql代码慢:例如联接、筛选器where子句和分组。您所做的就是所谓的投影,客户机代码比sql代码更擅长投影。
<td id="preis_0" class="m92_t_col5">xx</td>
<td id="preis_2" class="m29_t_col5">no fix req</td>
<td id="preis_49" class="m29_t_col5">no fix req</td>
<td  id="preis_3" class="m93_t_col50">xy</td>
<td      id="preis_5" style="fuzzy" class="m95_t_col5">xz</td>
<td id="preis_8" class="m29_t_col5">no fix req</td>
-- Same logic as above, now in function form
CREATE FUNCTION dbo.ClassIdSwap
(
    @input varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
    DECLARE
        @class_ordinal int
    ,   @class_text varchar(max)
    ,   @class_ordinal_end_quote int
    ,   @id_ordinal int
    ,   @id_text varchar(max)
    ,   @id_ordinal_end_quote int
    ,   @out_html varchar(max)

    SELECT
        @class_ordinal = CHARINDEX('class=', @input, 0) 
    ,   @id_ordinal = CHARINDEX('id=', @input, 0) 

    SELECT
        @class_ordinal_end_quote = CHARINDEX('"', @input, @class_ordinal+7) + 1
    ,   @id_ordinal_end_quote = CHARINDEX('"', @input, @id_ordinal+4) + 1 

    -- bail out early
    IF (@id_ordinal < @class_ordinal)
    BEGIN
        RETURN @input
    END

    SELECT    
        @class_text = SUBSTRING(@input, @class_ordinal, @class_ordinal_end_quote - @class_ordinal)
    ,   @id_text = SUBSTRING(@input, @id_ordinal, @id_ordinal_end_quote - @id_ordinal)

    RETURN (REPLACE(REPLACE(REPLACE(@input, @class_text, '~~|~'), @id_text, @class_text), '~~|~', @id_text))

END
;
WITH SAMPLE_DATA AS
(
    -- gin up some demo data
    -- with random spacing and ids to make valid test cases
    select '<td class="m92_t_col5" id="preis_0">xx</td>' AS html
    union all select '<td id="preis_2" class="m29_t_col5">no fix req</td>'
    union all select '<td id="preis_49" class="m29_t_col5">no fix req</td>'
    union all select '<td  class="m93_t_col50" id="preis_3">xy</td>'
    union all select '<td      class="m95_t_col5" style="fuzzy" id="preis_5">xz</td>'
    union all select '<td id="preis_8" class="m29_t_col5">no fix req</td>'
)
SELECT
    D.html  
,   dbo.ClassIdSwap(D.html) AS modified     
FROM
    SAMPLE_DATA D