2014-10-07 89 views
0

我不是新手编程,而是新手到mssql。我已经在网上寻求帮助,但我无处可去。卡住试图在mssql中使用uiee

我有一个UIEE格式的图书清单文件。

UR|2706 
AA|Parker, William Harwar 
TI|RECOLLECTIONS OF A NAVAL OFFICER, 1841-1865: 
XD|S 
UR|15184 
AA|Goodrich, Norma Lorre 
TI|King Arthur 

等等。正如你看到的每一行都被标记了一样,每条记录都以'UR'标记开始,并以'XD'标记结束。我已经把这个上传到了一个名为testuiee的mssql表格中,并带有列标签和数据。我试图用sql来识别这些字段,并将它们放到另一个名为btdata的表中。例如,把UR数据成册ID,AA为作者等

Book_id Author     Title 
2706  Parker, William Harwar RECOLLECTIONS OF A NAVAL OFFICER, 1841-1865: 
15184  Goodrich, Norma Lorre King Arthur 

我写的作品,但只把最后一个记录到btdata表中的脚本。我尝试了条件处理(while,if,case)和一个游标,但结果总是一个记录,最后一个。亚瑟王在这个例子中。我确定它是因为我正在逐行地思考事物,而不是数据块,但我无法理解这一点。

这是我的代码到目前为止。

DECLARE @bookid nvarchar(max), 
     @author nvarchar(max), 
     @title nvarchar(max) 


SELECT tag, data from testuiee 


SELECT @bookid = data from testuiee where tag = 'UR' 
SELECT @author = data from testuiee where tag = 'AA' 
SELECT @title = data from testuiee where tag = 'TI' 


IF @bookid IS NOT NULL 
INSERT INTO btdata (book_id, author, title) 
VALUES (@bookid, @author, @title) 


GO 

我确实尝试使用'XD'标签有条件地执行插入,但结果相同。

任何帮助将不胜感激。

+0

你有一个行数场或类似的'testuiee'表订购的?请记住,数据库中的行是无序的,即使它们经常显示为处于插入顺序。 – 2014-10-07 21:22:23

+0

我没有。感谢您的解释。 – new2sql 2014-10-08 20:35:22

回答

1

您需要在表格中使用自动识别字段/ Rownumber字段,以便将行保留在一起。 随着你的脚本,你会得到适合你的条件的“随机”值。
使用ROW_NUMBER() OVER (Partition by tag Order By ID)您可以加入您的CTE并使用3个别名获得所需的结果。

使用SQL Server 2008 +,你可以使用一个CTE

declare @testui Table (ID integer Identity(1,1),tag varchar(10),data varchar(50)) 
declare @dest Table (book_id varchar(50),author varchar(50),title varchar(50)) 

Insert into @Testui 
Select 'UR','2706' 
Insert into @Testui 
Select 'AA','Parker, William Harwar' 
Insert into @Testui 
Select 'TI','RECOLLECTIONS OF A NAVAL OFFICER, 1841-1865:' 
Insert into @Testui 
Select 'XD','S' 
Insert into @Testui 
Select 'UR','15184' 
Insert into @Testui 
Select 'AA','Goodrich, Norma Lorre' 
Insert into @Testui 
Select 'TI','King Arthur' 

;With CTE as (
Select *,ROW_NUMBER() OVER (Partition by tag Order By ID) as RN 
from @Testui) 
Insert into @dest 
Select a1.Data as book_id,a2.data author,a3.data title 
from CTE a1 
JOIN CTE a2 ON a1.RN=A2.RN 
JOIN CTE a3 ON a1.RN=A3.RN 
Where a1.tag='UR' and a2.tag='AA' and a3.tag='TI' 

Select * from @dest 
+0

这工作就像一个魅力。我在想我需要某种阵列。谢谢您的帮助。 – new2sql 2014-10-08 20:34:13

+0

@ new2sql满意我可以帮忙 – bummi 2014-10-08 20:39:45