如何根据起始表中的各个行将多个唯一记录插入另一个表中

时间:2012-05-02 16:36:02

标签: sql sql-server insert while-loop fetch

如何逐行遍历表,并根据这些单独的行插入条目到MSSQL中的另一个表中?

4 个答案:

答案 0 :(得分:1)

如果必须逐行进行,则需要声明并使用光标。这通常不是一个好主意,我很好奇为什么你需要这样做。你问题上的标签(fetch,while)意味着你已经对游标有了一些线索。一般形式看起来像:

SET NOCOUNT ON;
DECLARE @num INT; -- other columns

- EDIT在下面的评论中添加了LOCAL STATIC READ_ONLY FORWARD_ONLY

DECLARE excruciatingly_slow CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR 
    SELECT 1  --this is just a sample, your query (which you might want to supply) will differ
    UNION ALL 
    SELECT 2;

OPEN excruciatingly_slow;    
FETCH NEXT FROM excruciatingly_slow
    INTO @num -- other variables
    ;

WHILE @@FETCH_STATUS > -1
    BEGIN
        -- Do something here
        INSERT destination_table
            (    column_list -- other columns...
            )
        SELECT @num -- other columns
            ;

        FETCH NEXT FROM excruciatingly_slow
            INTO @num-- other variables
            ;
    END;
CLOSE excruciatingly_slow;
DEALLOCATE excruciatingly_slow;

在大多数情况下,使用其他回复建议的INSERT ... SELECT ...构造会更好。如果这是与课程相关的,则有一个家庭作业标签。我很难想到光标可以更好地服务于单个插入的情况。

答案 1 :(得分:0)

喜欢这个吗?

INSERT INTO <table> ( <columns> )
SELECT FROM <source_table> ( <matching number columns> )

答案 2 :(得分:0)

您可以这样做:

insert into Table2 (columnA, ColumnB)
select ColumnA, ColumnB from Table1
where ColumnA = 'Blah'

基本上你在一张桌子上做一个选择并将它插入另一张桌子

答案 3 :(得分:0)

您可以使用case

insert into destinationTable
    select case id when 1 then ...
           end
    from sourceTable