我有一个包含以下值的列(还有更多):
20150223-001
20150224-002
20150225-003
我需要写一个UPDATE语句,它会将短划线后的前两个字符更改为' AB'。结果必须如下:
20150223-AB1
20150224-AB2
20150225-AB3
有人可以帮助我吗?
提前致谢。
答案 0 :(得分:2)
使用此,
DECLARE @MyString VARCHAR(30) = '20150223-0000000001'
SELECT STUFF(@MyString,CHARINDEX('-',@MyString)+1,2,'AB')
答案 1 :(得分:0)
试,
update table set column=stuff(column,charindex('-',column)+1,2,'AB')
答案 2 :(得分:0)
Declare @Table1 TABLE (DateValue Varchar(50))
INSERT INTO @Table1
SELECT '20150223-000000001' Union all
SELECT '20150224-000000002' Union all
SELECT '20150225-000000003'
SELECT DateValue,
CONCAT(SUBSTRING(DateValue,0,CHARINDEX('-',DateValue)),
REPLACE(LEFT(SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue)),2),'00','-AB'),
SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue))) AS ExpectedDateValue
FROM @Table1
输出
DateValue ExpectedDateValue
---------------------------------------------
20150223-000000001 20150223-AB000000001
20150224-000000002 20150224-AB000000002
20150225-000000003 20150225-AB000000003
更新
Update @Table1
SEt DateValue= CONCAT(SUBSTRING(DateValue,0,CHARINDEX('-',DateValue)),
REPLACE(LEFT(SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue)),2),'00','-AB'),
SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue)))
From @Table1
SELECT * from @Table1
输出
DateValue
-------------
20150223-AB000000001
20150224-AB000000002
20150225-AB000000003
答案 3 :(得分:0)
根据OP评论: -
它总是在破折号之前的8个字符,但是后面的字符 短跑可以变化。它必须更新破折号后的前两个。
使用下一个简单的代码: -
DECLARE @MyString VARCHAR(30) = '20150223-0000000001'
SELECT REPLACE(@MyString,SUBSTRING(@MyString,9,3),'-AB')
结果: -
20150223-AB00000001
答案 4 :(得分:0)
如果有大量数据,您可以考虑使用.WRITE
子句。但它仅限于VARCHAR(MAX)
,NVARCHAR(MAX)
和VARBINARY(MAX)
数据类型。
如果您有以下列类型之一,.WRITE
子句最容易实现此目的,例如:
UPDATE Codes
SET val.WRITE('AB',9,2)
GO
其他可能的选择可能很简单REPLACE
:
UPDATE Codes
SET val=REPLACE(val,SUBSTRING(val,10,2),'AB')
GO
或STUFF
:
UPDATE Codes
SET val=STUFF(val,10,2,'AB')
GO
我基于以下信息:列中总是有8个字符的日期和一个破折号。我准备了一张桌子并检查了这里提到的一些解决方案。
CREATE TABLE Codes(val NVARCHAR(MAX))
INSERT INTO Codes
SELECT TOP 500000 CONVERT(NVARCHAR(128),GETDATE()-CHECKSUM(NEWID())%1000,112)+'-00'+CAST(ABS(CAST(CHECKSUM(NEWID())%10000 AS INT)) AS NVARCHAR(128))
FROM sys.columns s1 CROSS JOIN sys.columns s2
我运行了一些测试,基于带有NVARCHAR(MAX)
列的10kk行,我得到了以下结果:
+---------+------------+
| Method | Time |
+---------+------------+
| .WRITE | 28 seconds |
| REPLACE | 30 seconds |
| STUFF | 15 seconds |
+---------+------------+
正如我们所看到的,STUFF
看起来是更新字符串部分的最佳选择。在将新数据插入或附加到字符串中时应考虑.WRITE
,如果数据库恢复模型设置为批量记录或简单,则可以利用最小化日志记录。根据MSDN文章UPDATE
声明:Updating Large Value Data Types