在sql server中插入时将一行拆分为两行

在sql server中插入时将一行拆分为两行,sql,sql-server,bulkinsert,Sql,Sql Server,Bulkinsert,我有一个原始表,我想根据类别将一行拆分为两行。 我的代码现在正按照预期工作。但我想删除执行此任务的while循环 我无法使用批量插入来执行此操作。我的代码无法处理更多记录,因为我在excel上载时执行此操作 CREATE TABLE #RAW_TABLE (ID INT IDENTITY(1,1),FIELD1 VARCHAR(100),CATEGORY VARCHAR(100)) INSERT INTO #RAW_TABLE (FIELD1,CATEGORY) VALUES ('DATA',

我有一个原始表,我想根据类别将一行拆分为两行。 我的代码现在正按照预期工作。但我想删除执行此任务的while循环

我无法使用批量插入来执行此操作。我的代码无法处理更多记录,因为我在excel上载时执行此操作

CREATE TABLE #RAW_TABLE (ID INT IDENTITY(1,1),FIELD1 VARCHAR(100),CATEGORY VARCHAR(100))

INSERT INTO #RAW_TABLE (FIELD1,CATEGORY) VALUES ('DATA','SINGLE')
INSERT INTO #RAW_TABLE (FIELD1,CATEGORY) VALUES ('DATA','SINGLE')
INSERT INTO #RAW_TABLE (FIELD1,CATEGORY) VALUES ('DATA','SPLIT')
INSERT INTO #RAW_TABLE (FIELD1,CATEGORY) VALUES ('DATA','SINGLE')
INSERT INTO #RAW_TABLE (FIELD1,CATEGORY) VALUES ('DATA','SINGLE')

CREATE TABLE #PROCESSED_TABLE (ID INT IDENTITY(1,1),FIELD1 VARCHAR(100),CATEGORY VARCHAR(100))

Declare @Int int,@Field1 Varchar(100),@Category Varchar(100)
WHILE ((SELECT COUNT(*) FROM #RAW_TABLE) > 0)
BEGIN   
    PRINT ''
    SELECT top 1 @Int = ID,@Field1 = FIELD1,@Category = CATEGORY FROM #RAW_TABLE 

    if(@Category = 'SPLIT')
    begin   
        insert into #PROCESSED_TABLE (FIELD1,CATEGORY) values (@Field1 + '-1',@Category)
        insert into #PROCESSED_TABLE (FIELD1,CATEGORY) values (@Field1 + '-2',@Category)
    end
    else
    begin
        insert into #PROCESSED_TABLE (FIELD1,CATEGORY) Values (@Field1,@Category)
    end

    Delete from #RAW_TABLE Where id = @Int 
END


Select * From #PROCESSED_TABLE 
输出:-

您可以通过查询执行您想要的操作。无需循环:

insert into #processed_table (field1, category)
    select (case when rt.category = 'SPLIT'
                 then concat(rt.field1, '-', v.n)
                 else rt.field1
            end), rt.category
    from #raw_table rt cross join
         (values (1), (2)) v(n)
    where v.n = 1 or rt.category = 'SPLIT';

对于拆分记录,您可以放置
UNION ALL
并插入两次

insert into #PROCESSED_TABLE (FIELD1,CATEGORY) 
SELECT concat('DATA','-1') AS FIELD1, category  FROM #RAW_TABLE as T1
WHERE T1.CATEGORY = 'SPLIT'
UNION ALL
SELECT concat('DATA','-2') AS FIELD1, category  FROM #RAW_TABLE as T1
WHERE T1.CATEGORY = 'SPLIT'

您可以使用游标而不是while loop。请提供示例数据和所需结果。先生,我的主要问题是我想将-1和-2与该数据连接起来。@HardikParmar对于有多年tsql经验的人来说,这应该是一个微不足道的改变。您需要一个case表达式来为category列提供适当的值——试试看。如果只关注select语句并在该select语句的列列表中包含v.n列,您会发现这更容易理解/可视化。