1

这是我拥有的数据类型:

ENT*2*2J*EI*A25530181
NM1*IL*1*DOBIAS*ROSE*M
RMR*AZ*10100314**362.45
DTM*582****RD8*20120301-20120331
ENT*3*2J*EI*A54700554
NM1*IL*1*LOMBARDO*LUIS*J
RMR*AZ*10100314**362.45
DTM*582****RD8*20120301-20120331

情况是我需要从每一行中提取信息并用它填充另一个表。所以就像从 ENT 开始的行一样,我需要代码 A25530181 并将其放入另一个表中。我已经掌握了提取信息的所有逻辑。只需要弄清楚如何将它放入另一个没有游标的表中。此表中前 4 行的信息将成为新行中的一行。所以

ENT*2*2J*EI*A25530181
NM1*IL*1*DOBIAS*ROSE*M
RMR*AZ*10100314**362.45
DTM*582****RD8*20120301-20120331

将用于使用上面给出的数据中的客户代码、日期和金额填充新表的一行。Row is DTM 提供日期,row with RMR 提供费率。我有逻辑来提取信息。只需要帮助将其放入没有光标的新表中。

这是示例逻辑:

SELECT @Asterisk1Pos = CHARINDEX(@Delimeter, REVERSE(DATA)) - 1
from @TEMP_TABLE
WHERE LEFT(DATA,3) = 'ENT'

SELECT TOP 1 RIGHT(DATA, @Asterisk1Pos) 
from @TEMP_TABLE 
WHERE LEFT(DATA,3) = 'ENT'

这样我只有一行的信息。

4

1 回答 1

1

你说你有从记录中解析数据的提取逻辑,所以我不会详述。您的问题似乎是您必须根据其内容处理每条记录,不能使用 DTS 或 SSIS,可以使用 T-SQL,但不能使用游标。

如果您可以使用 DTS 或 SSIS,或者可以使用 PC 编程语言来处理您的记录并执行插入语句,请这样做。如果这是一个临时的事情,并且您可以在 Excel 中预处理您的记录,我什至会在尝试在 T-SQL 中实现这一点之前这样做。但是,如果这些都不适用并且 T-SQL 是您拥有的唯一工具,那么如果我处于您的位置,下面是对我将采取的步骤的描述:

  1. 创建一个临时表,其中包含记录,但还有一个表示行号的附加列。您可以使用 ROW_NUMBER() 函数来获取此信息。(查一下:语法与大多数 T-SQL 函数有点不同。)

  2. 假设您的临时表被调用@Temp并且您的字段被调用RecordNumberand Data,创建另一个临时表,它将四个(它总是四个,对吗?)记录连接在一起,形成一个记录,如下所示:

    选择 T1.RecordNumber,T1.data 作为 Data1,T2.data 作为 Data2,T3.data 作为 Data3,T4.data 作为 Data4 从@Temp T1 JOIN @Temp T2 ON T1.RecordNumber = T2.RecordNumber - 1 JOIN @Temp T3 ON T1.RecordNumber = T3.RecordNumber - 2 加入 @Temp T4 ON T1.RecoreNumber = T4.RecordNumber - 3

    我们将调用您的第二个临时表@Temp2

  3. 编写一个表值函数,将@Temp2 中的所有5 个字段作为参数,并返回一个表值函数,输出表格式为目标表格式。这是您放置所有解析逻辑的地方。假设您的函数被调用dbo.udf_Function1

  4. 插入目标表(我们称之为 Target),如下所示:

    插入@Target SELECT F1.* FROM @Temp2 T2 交叉应用 dbo.udf_Function1(T2.RecordNumber, T2.Data1, T2.Data2, T2.Data3, T2.Data4) F1

这是因为(我认为)SQL 2005 中引入了 CROSS APPLY 功能。它将具有将每次调用返回的单个记录聚合udf_Function1到一组记录中的效果,您可以在插入时从中选择。

于 2012-04-20T01:10:32.180 回答