首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Row1与Row2、Row3与Row4结合起来

将Row1与Row2、Row3与Row4结合起来
EN

Stack Overflow用户
提问于 2011-02-14 11:18:43
回答 3查看 646关注 0票数 0

我有个小问题。我需要能够将带有Row2的表连接到另一个/ Row1 /表,并在第三行重新开始,在Row4上加入Row3。以此类推。

我的问题是Row1和Row2之间没有关系。唯一的共同点是Row2是Row1的一部分。

这可以做到吗?(可由SQL SERVER、SSIS或ASP.NET VB完成)

下面是column1格式的数据输出示例(单列)

代码语言:javascript
复制
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导入),但每次导入前都可以手动清理(不首选)。

更新:

在csv转换过程中,我试图通过StoredProcedure中的光标将ROWID添加到表中。然而,我遇到了困难。我遇到的问题是(我认为)我设置的ROWID变量不断被释放,因此无法保持计数。

下面是我的SP (没有ROWID行)。你知道我该怎么做吗。我会在之后执行插入操作,但这只会将行添加到表的底部。

代码语言:javascript
复制
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“。未绑定计数。

游标有没有我可以点击的内置行数?

EN

回答 3

Stack Overflow用户

发布于 2011-02-14 11:35:54

如果您有一个对行进行编号的int id列...接下来你可以做这样的事情...

代码语言:javascript
复制
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

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

代码语言:javascript
复制
alter table testTable add row_id int identity(1,1)

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

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2011-02-14 12:46:45

您需要了解的第一件事是,如果没有ORDER BY子句,就不能100%保证表行的输出顺序。您从CSV导入的内容可能是按顺序导入的,但您必须在CSV数据中有一个键,或一个保留插入顺序的标识列,这样才能正常工作。

一旦您克服了这一点,jsobo的查询就可以很好地将数据拆分到奇数列并连接到偶数列。

票数 1
EN

Stack Overflow用户

发布于 2011-03-09 00:55:22

我可能没有完全按照你在这里做的,所以如果我偏离了轨道,我道歉,但是一个小的DOS BAT文件能不能不为你做连接,然后你可以把它拉到你需要的地方?

代码语言:javascript
复制
@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
   )
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4988561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档