T-SQL:将数据从一个表插入另一个表而不使用游标

时间:2012-04-19 22:23:04

标签: sql database

这是我的数据类型:

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'

这样我只有一行信息。

1 个答案:

答案 0 :(得分:1)

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

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

  1. 创建一个包含其中记录的临时表,但另外一列表示行号。您可以使用ROW_NUMBER()函数来实现此目的。 (查阅:语法与大多数T-SQL函数有点不同。)

  2. 假设您的临时表名为@Temp且您的字段名为RecordNumberData,请创建另一个连接四个的临时表(它总是四个,对吗?)属于一个记录的记录,如下所示:

    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

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

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

    INSERT INTO @Target 选择F1。* FROM @ Temp2 T2          交叉申请dbo.udf_Function1(T2.RecordNumber,T2.Data1,T2.Data2,T2.Data3,T2.Data4)F1

  5. 这是有效的,因为(我认为)SQL 2005中引入了CROSS APPLY功能。它会将每个udf_Function1调用返回的单个记录聚合成一组记录,您可以选择来自插入。