将逗号分隔的字段拆分为大量行

奥因·以扫

我正在尝试将数据从一种模式迁移到另一种模式,并且在拆分以逗号分隔的字段时遇到一些问题。

S1:源数据库

S2:目标数据库

S1有一个名为场ownerUserIDList其链接到阿米德在S2中,问题是,S2只允许在这一领域的值为1,而S1可以有多个,是逗号在数据库中,所以我的计划是到外地和更新S2分裂与分隔拆分的最后一个元素。

问题是它花费的时间太长,并且经常超时。该表大约有60万行。我尝试了一些在SO上发现的方法,但是对于大型数据集,似乎没有一个方法如此之快。

下面的所有示例都将变为用于实际数据迁移的更新语句,这些只是用于比较运行时间。

方法1:

SELECT TOP 100000 CASE 
        WHEN ownerUserIDList LIKE '%,%' THEN SUBSTRING( ownerUserIDList , LEN(ownerUserIDList) -  CHARINDEX(',',REVERSE(ownerUserIDList)) + 2  , LEN(ownerUserIDList)  )
        ELSE ownerUserIDList
    END
FROM S1.UserTable WHERE ownerUserIDList != '' AND ownerUserIDList IS NOT NULL

SQL Server执行时间:CPU时间= 2359毫秒,经过的时间= 728479毫秒。

方法2:

SELECT TOP 100000 value 
FROM S1.UserTable
    CROSS APPLY STRING_SPLIT(ownerUserIDList, ',') 
    WHERE ownerUserIDList != '' AND ownerUserIDList IS NOT NULL
GO

SQL Server执行时间:CPU时间= 1719 ms,经过的时间= 399817 ms。

考虑到我将不得不在多个甚至更大的表上运行类似的查询,这两者都非常慢。是否有其他方法可以更快地拆分这些字段?

表结构非常简单:

S1

UserID    ownerUserIDList   S2_AMID
---------------------------------------
1           20              1
2           20, 21, 23      4
3           21, 22, 23      4

S2

AMID    S1_UserID
-----------------
1       20
2       21
3       22
4       23
汤姆

如果您真的只想要最后一个条目,请尝试此操作。您可以添加子句以避免空列表或单个条目列表。

declare @t table(UserID int, OwnerID varchar(50))
insert @t values (1,'1,2,3'),(2,'3,4,5'),(3,'6,7,8')
select *, left(reverse(ownerID),CHARINDEX(',',reverse(ownerID))-1) from @t

这非常接近您的第一个选择,但我怀疑您会更接近。也许是CLI功能?我将它留给其他人来编写。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章