2016-01-25 38 views
-1

我有一個SQL Server數據庫,其中包含一個表feedback,其中包含一個文本列comment。在此專欄中,我有標籤數據,例如從文本列中刪除文本的SQL Server查詢

This is my record <tag>Random characters are here</tag> with information. 

如何編寫一個查詢來更新所有的這些記錄刪除<tag></tag>和所有文本之間?

我想寫這到不同的'臨時'表來首先驗證更改,然後更新原始表。

我正在運行SQL Server 2014 Express。

謝謝

+0

T-SQL對此是錯誤的工具。嘗試編寫一個小控制檯應用程序來讀取這些字段值,並使用RegEx或HTML解析器(如HTML敏捷包)解析它們。 –

+1

做2個子字符串使用as參考開始和結束標記並將它們連接在一起更新 – Mihai

+0

選中此[SO帖子](http://stackoverflow.com/questions/4341613/alternatives-to-replace-on-a-text - 或 - ntext-datatype),我認爲這將有助於.. – vmachan

回答

1

這裏是去除標籤功能..

CREATE FUNCTION [dbo].[RemoveTag](@text NVARCHAR(MAX), @tag as nvarchar(max)) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    declare @startTagIndex as int 
    declare @endTagIndex as int 

    set @startTagIndex = CHARINDEX('<' + @tag + '>', @text) 
    if(@startTagIndex > 0) BEGIN 
     set @endTagIndex = CHARINDEX('</' + @tag + '>', @text, @startTagIndex) 
     if(@endTagIndex > 0) BEGIN 
      return LEFT(@text, @startTagIndex - 1) + RIGHT(@text, len(@text) - len(@tag) - @endTagIndex - 2) 
     END 
    END 

    return @text 
END 

稍後,您可以使用它像:

Update table set field = dbo.RemoveTag(field, 'tag') 

如果你想寫入其他表中的字段,則:

CREATE TABLE dbo.OtherTable (
    OtherField nvarchar(MAX) NOT NULL 
) 
GO 

INSERT INTO OtherTable (OtherField) 
SELECT dbo.RemoveTag(field, 'tag') from table 
0

您可以使用CHARINDEX來查看您的標籤開始和停止,SUBSTRING得到<和>之間的所有文本,並替換以換出子字符串「」。

Select Field, 
Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, 
    (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1) as ToRemove, 
replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>', 
    Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '') 
    as FinalResult 

從表名

輸出將是三列,場,文檔,刪除和FinalResult,但沒有實際被更新。

我認爲這將失敗的唯一方法是如果你有嵌套標籤。 <b><i>sometext</i></b>

要真正做出改變:

Update #TableName set Field = replace (Field, Substring(FIELD, charindex('<', Field), CHARINDEX('>', Field, (CHARINDEX('>', FIELD)) + 1) - charindex('<', Field)+1), '') 

測試的SQL Server 2012年

1

使你的字符串的格式很多假設。但是,如果他們是有效的,那麼這是非常簡單的:

left(s, charindex('<tag>', s - 1)) + 
    substring(s, charindex('</tag>', s) + 6, len(s)) 

顯然,我們基本上假定的搜索字符串中只出現一次,並以正確的順序。還有一個假設是會有匹配的。此外,我使用len(s)作爲從右側取得的字符數的上限。如果你覺得這樣做,你可以硬編碼一些合適的東西,因爲SQL Server不會因爲結束而出錯。 s只是你的char列的一個標誌。

http://sqlfiddle.com/#!3/771a3/8

不知道是否額外的空白將是一個問題,所以你可能要修剪,並在中間增加一個空格字符。

rtrim(left(s, charindex('<tag>', s) - 1)) + ' ' + 
    ltrim(substring(s, charindex('</tag>', s) + 6, len(s)))