坚持尝试在mssql中使用uiee

时间:2014-10-07 21:06:21

标签: sql sql-server

我不是新编程,而是mssql的新手。我已经在网上搜索了这方面的帮助,但我无处可去。

我有一个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数据放入Book id,将AA放入作者等

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

我编写的脚本有效,但只将最后一条记录放入btdata表中。我已经尝试过条件处理(虽然,如果是大小写)以及光标,但结果始终是一条记录,最后一条记录。在这个例子中亚瑟王。我确定它是因为我正在逐行思考事物而不是数据块,但我无法理解这一点。

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

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'标签有条件地执行插入,但结果相同。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要在表格中使用自动ID字段/ Rownumber字段才能将行保持在一起。 有了你的脚本,你会得到随机的#34;适合您条件的价值 使用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