【发布时间】:2011-03-13 23:59:25
【问题描述】:
我正在从设计不佳的旧数据库升级到新数据库。在旧数据库中,tableA 带有字段 Id 和 Commodities。 Id 是主键,包含一个 int,而 Commodities 包含一个逗号分隔的列表。
表A:
id | commodities
1135 | fish,eggs,meat
1127 | flour,oil
在新数据库中,我希望 tableB 采用 id,commercial 形式,其中每个商品都是 tableA 中逗号分隔列表中的单个项目。
表B:
id | commodity
1135 | fish
1135 | eggs
1135 | meat
1127 | flour
1127 | oil
我有一个函数,functionA,当给定一个 id、一个列表和一个分隔符时,它会返回一个带有 id 和 item 字段的表。如何使用这个函数将tableA中的两个字段变成tableB?
(注意:我无法确定该问题的标题。请随时编辑标题以使其更准确地反映问题!)
功能代码如下:
ALTER FUNCTION dbo.functionA
(
@id int,
@List VARCHAR(6000),
@Delim varchar(5)
)
RETURNS
@ParsedList TABLE
(
id int,
item VARCHAR(6000)
)
AS
BEGIN
DECLARE @item VARCHAR(6000), @Pos INT
SET @List = LTRIM(RTRIM(@List))+ @Delim
SET @Pos = CHARINDEX(@Delim, @List, 1)
WHILE @Pos > 0
BEGIN
SET @item = LTRIM(RTRIM(LEFT(@List, @Pos - 1)))
IF @item <> ''
BEGIN
INSERT INTO @ParsedList (id, item)
VALUES (@id, CAST(@item AS VARCHAR(6000)))
END
SET @List = RIGHT(@List, LEN(@List) - @Pos)
SET @Pos = CHARINDEX(@Delim, @List, 1)
END
RETURN
END
【问题讨论】:
-
你的意思通常被称为规范化(1. 准确的规范形式)。也许您想将此添加到您的标题中。
-
@Rup:将其发布为答案。
-
@Rup- 谢谢,谢谢,谢谢!请将其作为答案发布,以便我投票和接受。
-
好的,当然,完成。我不确定你的功能是什么,所以我不知道这是否回答了整个问题。
标签: sql sql-server sql-server-2000 normalization split-function