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