将Row1与Row2连接,Row3与Row4连接

时间:2011-02-14 03:18:43

标签: sql vb.net ssis

我有一点问题。我需要能够将Row1与Row2连接到另一个/ row / table,并在第3行再次开始,在Row4上连接Row3 ......等等。

我遇到的问题是Row1和Row2之间没有任何关系。唯一常见的是Row2是Row1的一部分。

可以这样做吗? (可以通过SQL SERVER,SSIS或ASP.NET VB完成)

以下是column1(单列)

中数据的示例输出
ROW1: 000201031993 JOHN SMITH         Enabled             02/10/2011 08:43:13 
ROW2: -->Key Fob/Passcode/AES              02/14/2008 00:00:00   07/31/2011 00:00

ROW3: 000201031994 FOO GLOO          Enabled             02/13/2011 11:01:58 
ROW4: -->Key Fob/Passcode/AES              02/14/2008 00:00:00   07/31/2011 00:00

还有其他垃圾在表(第几列)(这是通过SSIS进口从CSV)的开始(首部信息等),但此可清理手动(未优先停留)的导入之前的每个时间..

更新

我试图通过StoredProcedure中的Cursor在csv converision期间将ROWID添加到表中。但是,我遇到了困难。我遇到的问题是(我认为)我设置的ROWID变量不断被取消分配,因此无法保持计数。

下面是我的SP(没有ROWID行)。知道我怎么能做到这一点。之后我会做一个插入,但只是添加表格底部的行。

Declare @success integer
Declare @Var_RowID integer
Declare @Var_TokenID integer
Declare @Var_DisplayName varchar(50)
Declare @Var_TokenStatus varchar(30)
Declare @Var_ImportDate datetime

DECLARE c1 cursor FAST_FORWARD for 

SELECT 

LTRIM(RTRIM(LEFT(rawdata,12))) as TokenID_V,
LTRIM(RTRIM(SUBSTRING(rawdata, 13, (35 - 13)))) as DisplayName_V,
LTRIM(RTRIM(Replace((Substring(substring(rawdata, 35, LEN(rawdata)),1,20)),'.',''))) as TokenStatus_v,
Getdate() as ImportDate_V
FROM TokenDataInput
WHERE RawData like ('0%')
ORDER BY TokenID_V ASC

OPEN c1
FETCH NEXT FROM c1 INTO

@Var_TokenID,
@Var_DisplayName,
@Var_TokenStatus,
@Var_ImportDate

WHILE @@FETCH_STATUS = 0
BEGIN

INSERT INTO dbo.TokenData_Formatted(DisplayName, TokenStatus, ImportData)
VALUES(@Var_TokenID, @Var_DisplayName, @Var_TokenStatus, @Var_ImportDate)

FETCH NEXT FROM c1 INTO

@Var_TokenID,
@Var_DisplayName,
@Var_TokenStatus,
@Var_ImportDate

END
CLOSE C1
DEALLOCATE C1

SET @success = 1

RETURN @success

END
enter code here

此外,我尝试使用Cursor.rowID,但获得了“Multipart indetifier”..数不受约束。

光标是否有我可以点击的内置行数?

3 个答案:

答案 0 :(得分:3)

如果你有一个编号行的int id列...顺序你可以做这样的事情......

SELECT TOP 1000 
      t1.[name],
      t1.[row_id],
       t2.[name],
      t2.[row_id]  
  FROM [testTable] t1
  inner join [testTable] t2 on t1.row_id = (t2.row_id +1)
  where (t1.row_id % 2) = 1

如果您没有这样的专栏,可以使用......

alter table testTable add row_id int identity(1,1)

因此您的查询可能如下所示......

SELECT t1.[Data] + ' ' + t2.[Data]
    FROM [testTable] t1
        inner join [testTable] t2 
            on t1.row_id = (t2.row_id +1)
    where (t1.row_id % 2) = 1

答案 1 :(得分:1)

首先需要了解的是,如果没有ORDER BY子句,表行的输出顺序就没有100%的保证。您从CSV导入的内容可能是有序的,但您必须在CSV数据中包含密钥,或者保留插入顺序的IDENTITY列才能生效。

一旦你完成了这个过程,jsobo的查询就可以通过将奇数列上的数据拆分并连接到偶数来实现。

答案 2 :(得分:0)

我可能不会完全理解你在这里所做的事情,所以我道歉如果我偏离轨道但是有一点DOS BAT文件没有为你做concat然后你可以把它拉进你需要的地方吗? / p>

@echo off
Setlocal EnableDelayedExpansion
set oddRow=Empty

FOR /F "tokens=* delims= " %%A in (c:\temp\test.txt) do (
   if "!oddRow!" == "Empty" (
      set oddRow=%%A
   ) else (
      echo !oddRow! %%A >> testout.txt
      set  oddRow=Empty
   )
)