Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将第1行与第2行、第3行与第4行合并_Sql_Vb.net_Ssis - Fatal编程技术网

Sql 将第1行与第2行、第3行与第4行合并

Sql 将第1行与第2行、第3行与第4行合并,sql,vb.net,ssis,Sql,Vb.net,Ssis,我有个小问题。我需要能够将第1行和第2行连接到另一个/行/表,并在第3行重新开始,在第4行连接第3行。。等等 我的问题是,第1行和第2行之间没有关系。唯一常见的是,第2行是第1行的一部分 这能做到吗?(可以通过SQL SERVER、SSIS或ASP.NET VB完成) 下面是第1列(单列)中数据的输出示例 在表的开头(前几列)(通过SSIS从csv导入)还有其他垃圾(标题信息等),但每次导入前都可以手动清理(不优先) 更新: 在csv转换过程中,我试图通过StoredProcess中的光标将RO

我有个小问题。我需要能够将第1行和第2行连接到另一个/行/表,并在第3行重新开始,在第4行连接第3行。。等等

我的问题是,第1行和第2行之间没有关系。唯一常见的是,第2行是第1行的一部分

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

下面是第1列(单列)中数据的输出示例

在表的开头(前几列)(通过SSIS从csv导入)还有其他垃圾(标题信息等),但每次导入前都可以手动清理(不优先)

更新: 在csv转换过程中,我试图通过StoredProcess中的光标将ROWID添加到表中。然而,我有困难。我遇到的问题是(我认为)我设置的ROWID变量一直处于释放状态,因此无法保持计数

下面是我的SP(不带ROWID行)。你知道我该怎么做吗。我会在之后做一个insert,但这只是将行添加到表的底部

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,但得到了“多部分索引器”。。伯爵不受约束


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

如果您有一个对行进行编号的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
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
如果你没有这样的专栏,你可以用

alter table testTable add row_id int identity(1,1)
所以您的查询可能如下所示

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
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

如果您有一个对行进行编号的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
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
如果你没有这样的专栏,你可以用

alter table testTable add row_id int identity(1,1)
所以您的查询可能如下所示

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
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

您需要了解的第一件事是,如果没有ORDERBY子句,就无法100%保证表行的输出顺序。您从CSV导入的内容可能是有序的,但您必须在CSV数据中有一个键,或者有一个保留插入顺序的标识列,以便此项工作


一旦您完成了这项工作,jsobo的查询将通过拆分奇数列上的数据并连接到偶数列来工作。

您需要了解的第一件事是,如果没有ORDERBY子句,就无法100%保证表行的输出顺序。您从CSV导入的内容可能是有序的,但您必须在CSV数据中有一个键,或者有一个保留插入顺序的标识列,以便此项工作


一旦你过了这一关,jsobo的查询通过将奇数列上的数据拆分并连接到偶数列而工作得很好。

我可能没有完全遵循你在这里所做的,所以如果我偏离了轨道,我很抱歉,但是一个小DOS BAT文件是否可以不为你做concat,然后你可以在需要的地方拉它

@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
   )
)

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

@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
   )
)

我可以理解在sql中完成这一切的愿望,但通常在程序中处理这样的文件要容易得多。我注意到的另一件事是,您必须进行一些转换,以将字符串转换为数字,然后进行错误处理。。。这在SQL中并不是那么有趣是的,有一个try-catch,但在SQL中处理解析错误比在编程语言中更难。这是SQL CLR函数处理该字符串解析的主要候选函数。我可以理解在SQL中完成这一切的愿望,但通常在程序中处理这样的文件要容易得多。我注意到的另一件事是,您必须进行一些转换,以将字符串转换为数字,然后进行错误处理。。。这在SQL中并不是那么有趣是的,有一个try-catch,但在SQL中处理解析错误比在编程语言中更难。这是SQL CLR函数处理该字符串解析的主要候选函数。