我有一个具有唯一 id 的表 Items:itemId,... 行示例:'3506',...</p>
我有一个表 ItemProperties,其中包含以下列: itemId、datecreated、datemodified、property1、property2、property3、property4、property5
行示例:'3506'、'2012...'、'2012...'、'prop1'、'prop2'、'prop3'、'prop4'、'prop5'</p>
我需要将 ItemProperties 表的每一行拆分为 NewItemProperties 表中的 5 个单独的行,其中包含以下列: itemId、datecreated、datemodified、propertynumber、property
5行的示例:
‘3506’, ‘2012…’, ‘2012…’, 1, ‘prop1’
‘3506’, ‘2012…’, ‘2012…’, 2, ‘prop2’
‘3506’, ‘2012…’, ‘2012…’, 3, ‘prop3’
‘3506’, ‘2012…’, ‘2012…’, 4, ‘prop4’
‘3506’, ‘2012…’, ‘2012…’, 5, ‘prop5’
约束: - ItemProperties 的 itemId 不再出现在 Items 表中
已经在 NewItems 表中的项目(id =id 和 propertynumber=property1~5 列的数量)不应被此过程覆盖/更新
微软 SQL Server 2008 R2
ItemProperties 表中大约有 800000 行
我现在有非常慢的解决方案:
...
DECLARE c CURSOR read_only FOR SELECT * from ItemProperties
DECLARE @ID varchar(14), @CREA datetime, …
OPEN c
FETCH NEXT FROM c INTO @ID, @CREA, @MODI, @COL, @SIZE, @PAT, @YEAR, @ITEM
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
select * from Items where itemId = @ID
if @@ROWCOUNT = 0
BEGIN
GOTO Fetch_Next
END
select * from ItemProperties where itemId = @ID AND propertynumber = 1
if @@ROWCOUNT = 0
INSERT INTO NewItemProperties
VALUES(@ID, '1', @COL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
select * from ItemProperties where itemId = @ID AND propertynumber = 2
if @@ROWCOUNT = 0
INSERT INTO NewItemProperties
VALUES(@ID, '2', @SIZE, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
…
END
Fetch_Next:
FETCH NEXT FROM c INTO @ID, @CREA, @MODI, @COL, @SIZE, @PAT, @YEAR, @ITEM
...
我可以通过删除创建和修改日期来优化我的 fetch 语句,但这就是我能想到的。我无法将其放入非透视查询中。基本上任何比光标更快的东西都会帮助我。欢迎所有想法。谢谢你。