我不是新编程,而是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'标签有条件地执行插入,但结果相同。
非常感谢任何帮助。
答案 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