这是我的数据类型:
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是DTM提供日期,而行与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'
这样我只有一行信息。
答案 0 :(得分:1)
你说你有提取逻辑用于解析记录中的数据,所以我不会详述。您的问题似乎是您必须根据其内容处理每条记录,不能使用DTS或SSIS,可以使用T-SQL,但不能使用游标。
如果您可以使用DTS或SSIS,或者可以使用PC编程语言来处理记录并执行插入语句,请执行此操作。如果这是一个临时的事情,你可以在Excel中预处理你的记录,我甚至会在尝试在T-SQL中实现这一点之前做到这一点。但是如果这些都不适用并且T-SQL是你唯一的工具,那么这里描述了我在你的位置时所采取的步骤:
创建一个包含其中记录的临时表,但另外一列表示行号。您可以使用ROW_NUMBER()函数来实现此目的。 (查阅:语法与大多数T-SQL函数有点不同。)
假设您的临时表名为@Temp
且您的字段名为RecordNumber
和Data
,请创建另一个连接四个的临时表(它总是四个,对吗?)属于一个记录的记录,如下所示:
SELECT T1.RecordNumber, T1.data为Data1, T2.data作为Data2, T3.data作为Data3, T4.data as Data4 来自@Temp T1 加入@Temp T2 ON T1.RecordNumber = T2.RecordNumber - 1 加入@Temp T3 ON T1.RecordNumber = T3.RecordNumber - 2 加入@Temp T4 ON T1.RecoreNumber = T4.RecordNumber - 3
我们会拨打您的第二个临时表@Temp2
。
编写一个表值函数,它将@ Temp2中的所有5个字段作为参数,并返回一个表值函数,输出表格式为目标表格式。这是您放置所有解析逻辑的地方。我们假设您的函数名为dbo.udf_Function1
。
插入目标表(我们称之为Target),如下所示:
INSERT INTO @Target 选择F1。* FROM @ Temp2 T2 交叉申请dbo.udf_Function1(T2.RecordNumber,T2.Data1,T2.Data2,T2.Data3,T2.Data4)F1
这是有效的,因为(我认为)SQL 2005中引入了CROSS APPLY功能。它会将每个udf_Function1
调用返回的单个记录聚合成一组记录,您可以选择来自插入。