我正在尝试将数据从一种模式迁移到另一种模式,并且在拆分以逗号分隔的字段时遇到一些问题。
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] 删除。
我来说两句