我的桌子有一列但超过100,000行 COL_NAME qwchijhuirhxnihdiuyfnx
dhjhfiurhncnmxmzjcoinrds
xnbxknsiiuncirnxknrxnxz
我需要插入'。'或'$'或每个第3个字符后的某个标记
所需结果示例:
Col_Name
qwc.hij.hui.rhx.nih.diu.yfn.x
dhj.hfi.urh.ncn.mxm.zjc.oin.rds.
xnb.xkn.sii.unc.irn.xkn.rxn.xz
我最初用以下方法解决了这个问题:
INSERT INTO New_Table
(
c1
,c2
,c3
)
SELECT
substring(CAST(Col_Name AS VARCHAR(MAX)),1,3) as C1
,substring(CAST(Col_Name AS VARCHAR(MAX)),4,3) as C2
,substring(CAST(Col_Name AS VARCHAR(MAX)),7,3) as C3
From Table_Name
这会在后面的脚本中导致问题,因此数据必须保留在一列中,但只要它是一个只有一列的新表,就可以插入到新表中
答案 0 :(得分:1)
这是一个平方的起点,您可以使用函数和while循环重构http://sqlfiddle.com/#!6/ab6dd/1/0。
如果您需要速度,您可以使用正则表达式或SQLCLR更有效率。
CREATE FUNCTION dotify (@input varchar(MAX))
RETURNS varchar(MAX)
AS
BEGIN
DECLARE @output varchar(MAX) = ''
declare @index int = 0
declare @length int
set @length = len(@input)
while @index <= @length
begin
SET @output = @output + substring(@input, @index, 1)
if (@index % 3) = 0 AND @index > 0
BEGIN
SET @output = @output +'.'
END
set @index = @index + 1
end
return(@output)
END
GO
select TOP 10000 col_name, dbo.dotify(col_name) FROM old_table
您可以使用TOP将处理时间限制为几秒钟,以便轻松分析您所做的效率变化。