有些对象被编码为键:值字符串并存储在表格中,我想增加所有对象的序列号,这是对象中的一个字段。
例如:
ID Value
--------------------------
504 s:0;d:n;e:test;
506 s:1;d:y;e:branch;
507 s:2;d:y;e:;
我想将它们改为:
ID Value
--------------------------
504 s:1;d:n;e:test;
506 s:2;d:y;e:branch;
507 s:3;d:y;e:;
有一种简单的方法吗?
答案 0 :(得分:6)
有一种简单的方法吗?
不,不是真的。
您可以找到s:
和d:
的位置,然后使用它来提取中间的数字,将其增加1并将其重新填充到它所属的位置。
declare @T table
(
ID int,
Value varchar(50)
);
insert into @T values
(504, 's:0;d:n;e:test;'),
(506, 's:1;d:y;e:branch;'),
(507, 's:2;d:y;e:;');
select T.ID,
stuff(T.Value, P.S, P.D - P.S - 1, S.Value) as NewValue
from @T as T
cross apply (values(charindex('s:', T.Value) + 2,
charindex('d:', T.Value))) as P(S, D)
cross apply (values(substring(T.Value, P.S, P.D - P.S - 1) + 1)) as S(Value)
一个版本,您可以在评论中按照Eric的建议找到;
之后的s:
而不是d:
。
select T.ID,
stuff(T.Value, S.Pos, SEnd.Pos - S.Pos, V.NewValue) as NewValue
from @T as T
cross apply (values(charindex('s:', T.Value) + 2)) as S(Pos)
cross apply (values(charindex(';', T.Value, S.Pos))) as SEnd(Pos)
cross apply (values(substring(T.Value, S.Pos, SEnd.Pos - S.Pos) + 1)) as V(NewValue)
答案 1 :(得分:0)
DECLARE @val nvarchar(200)
SET @val = 's:1;d:y;e:branch;'
SELECT 's:' + CONVERT(nvarchar(100), CONVERT(INT, SUBSTRING(@val, charindex(':', @val) + 1, charindex(';', @val) - charindex(':', @val) -1)) + 1) + SUBSTRING(@val, charindex(':', @val),1000)
您可以使用UPDATE语句中SELECT查询中的内容来更改表值
答案 2 :(得分:0)
使用此处的拆分字符串函数:Split strings the right way – or the next best way
declare @string varchar(max)
set @string='504 s:0;d:n;e:test;'
;with cte as(select * from
[dbo].[SplitStrings_Numbers]
(@string,':'))
select b.item+1 from cte c
cross apply
(select * from [dbo].[SplitStrings_Numbers](c.item,';')) b
where isnumeric(b.item)=1
答案 3 :(得分:0)
这可以解释空值或非整数值;如果它们不能增加一个,它将忽略它们。
-- Build Test Data
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test
CREATE TABLE #test (ID INT, Value VARCHAR(100))
INSERT #test
VALUES
(504,'s:0;d:n;e:test;'),
(506,'s:1;d:y;e:branch;'),
(507,'s:2;d:y;e:;'),
(508,'s:;d:y;e:;'),
(509,'s:xyz;d:y;e:;');
-- Update S: values
WITH sVals AS
(
SELECT ID, Value, TRY_PARSE(SUBSTRING(Value,CHARINDEX('s:',Value)+2,CHARINDEX(';',Value,CHARINDEX('s:',Value))-(CHARINDEX('s:',Value)+2)) AS INT) AS sVal
FROM #test AS t
)
UPDATE s
SET Value = IIF(sVal IS NOT NULL, STUFF(Value,CHARINDEX('s:',Value)+2,CHARINDEX(';',Value,CHARINDEX('s:',Value))-(CHARINDEX('s:',Value)+2),sVal+1), Value)
FROM sVals AS s
-- Check the results
SELECT *
FROM #test
答案 4 :(得分:0)
您可以如下所示:
DECLARE @val VARCHAR(100) = 's:12;d:n;e:test;'
SELECT REPLACE(@val, ':' + SUBSTRING(@val, 3, PATINDEX('%;d:%', @val) - 3) + ';', ':' + CAST(SUBSTRING(@val, 3, PATINDEX('%;d:%', @val) - 3)+ 1 AS VARCHAR(MAX)) + ';')
结果:s:13;d:n;e:test;