2015-10-14 83 views
1

我需要替換與字符串中特定鍵相關聯的值。SQL - 在特定值後替換值的第一個實例

例如,我有一個這樣的字符串:

'{"Key1":"Value1", "Key2":"Value2", "KeyToUpdate":"ValueToUpdate", "Key3":"Value3", "Key4":"Value4"}' 

將有一個名爲KeyToUpdate關鍵。它將永遠是獨一無二的,並將永遠被引號包圍。然後我需要更新它的相應值。即在引號包圍的冒號後面找到的第一個字符串。在本例中,值爲ValueToUpdate。同樣,冒號分隔符總是在那裏,值總是被引號括起來。

我期望的輸出,如果我更新了值UpdatedValue將是:

'{"Key1":"Value1", "Key2":"Value2", "KeyToUpdate":"UpdatedValue", "Key3":"Value3", "Key4":"Value4"}' 

我的問題是:

  1. 我怎麼能在一個更簡潔/清潔的方式做到這一點查詢
  2. 如何更改查詢以在列中的所有行上執行。

這裏是我的SQL:

DECLARE @Value NVARCHAR(256) = '{"Key1":"Value1", "Key2":"Value2", "KeyToUpdate":"ValueToUpdate", "Key3":"Value3", "Key4":"Value4"}' 

DECLARE @KeyToFind VARCHAR(256) = '"KeyToUpdate":"' 
DECLARE @LengthOfKeyToFind INT = LEN(@KeyToFind) 

DECLARE @StartIndex INT = PATINDEX('%'[email protected]+'%',@Value) 
DECLARE @EndIndex INT = CHARINDEX('"',SUBSTRING(@Value,@StartIndex + @LengthOfKeyToFind, LEN(@Value))) -1 

SELECT STUFF(@Value, @StartIndex + @LengthOfKeyToFind, @EndIndex, 'UpdatedValue') 
+2

該字符串從哪裏來?看起來很奇怪,你有一個數據庫管理系統,你可以簡單地擁有一個鍵值表,並且更新會非常簡單,但是你正在處理一個你試圖解析的字符串。這樣的字符串操作可能會比DBMS更容易,而使用真正的編程語言。 –

+0

@ThorstenKettner這是一個需要應用於單個表的一次性腳本(錯誤修復)。數據只是「記錄」我們需要存儲的數據,因此僅用於只讀目的。它不能也不應該作爲DBMS中的其他任何東西存儲。 – JBond

+0

也許你可以解析你的json然後修改。看看這個:https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/ –

回答

1

創建UDF返回更新的列值:

CREATE FUNCTION dbo.UpdateKeyValue(@Value NVARCHAR(MAX), 
            @KeyToFind NVARCHAR(100), 
            @ValueToUpdate NVARCHAR(100)) 
    RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    DECLARE @pattern NVARCHAR(105) = '%"'[email protected]+'":"%' 
    DECLARE @StartIndex INT = PATINDEX(@pattern, @Value) 

    -- A little defensive coding 
    IF @StartIndex = 0 RETURN @Value 

    DECLARE @EndIndex INT = CHARINDEX('"', @Value, @StartIndex + LEN(@pattern)) 

    RETURN STUFF(@Value, 
       @StartIndex + LEN(@pattern) - 2, 
       @EndIndex - (@StartIndex + LEN(@pattern) - 2), 
       @ValueToUpdate) 
END 

,然後在UPDATE語句中使用它:

UPDATE 
    SET column = dbo.UpdateKeyValue(column, N'KeyToFind', N'UpdatedValue') 
FROM 
    table 
WHERE 
    column LIKE '%"KeyToFind":"%' 

編輯:我花了很多時間格式化我的答案,我的船通過Tab Alleman在以太的評論。他對一次性光標的評論使得它具有良好的一次性意義。

0

因爲這是一次性轉換,所以應該起作用。

declare @start int = (select charindex('"KeyToUpdate"', colname) + len('"KeyToUpdate"') + 1 from tablename) 
declare @numchars int = (select charindex(',', 
         substring(colname, charindex('"KeyToUpdate"', colname) + len('"KeyToUpdate"') + 1, len(colname)) - 1 from tablename) 
declare @before varchar(255) = (select substring(colname, 1, charindex('"KeyToUpdate"', colname) - 2) from tablename) 
declare @after varchar(255) = (select substring(colname, @[email protected]+1, len(colname)) from tablename) 

select @before + substring(colname, @start, @numchars) + @after 
from tablename 
相關問題