Как мне сделать пакетные загрузки в SQL Server? - PullRequest
3 голосов
/ 27 мая 2010

Я использую оператор MERGE для переноса строк в базе данных SQL Server 2008. Тем не менее, мой sproc является однорядной операцией, тогда как на самом деле я бы предпочел пакетировать их. Возможно ли это вообще, и если да, то как мне это сделать?

Ответы [ 2 ]

5 голосов
/ 27 мая 2010

Можете ли вы использовать табличные параметры в вашем процессе? Взгляните сюда http://www.sommarskog.se/arrays-in-sql-2008.html#TVP_in_TSQL, чтобы получить некоторые идеи

Тогда в процедуре вы можете использовать MERGE против TVP

3 голосов
/ 28 мая 2010

Я создал процедуру под названием 'upsert', которая принимает имя исходной таблицы, имя целевой таблицы, поля для объединения и поля для обновления (поля разделяются запятыми), а затем выполняет динамическое слияние.

код ниже.

    CREATE proc [common].[upsert](@source nvarchar(100), @target nvarchar(100), @join_field nvarchar(100), @fields nvarchar(200))
    as

    --@source is the table name that holds the rows that you want to either update or insert into @target table
    --@join_field is the 1 field on which the two tables will be joined...you can only join on 1 field right now!
    --@fields are the comma separated fields that will either be updated or inserted into @target. They must be the same name in @source and @target


    declare @sql nvarchar(max)

    set @sql = '
        merge '+ @target +' as target
        using '+ @source +' as source
        on target.'+ @join_field +' = source.'+ @join_field +'
        when matched then
            update set
                ' + common.upsert_update_fields_string_builder('source', 'target', @fields) + '
        when not matched then
            insert ('+ @join_field +', '+ @fields +')
            values (source.'+ @join_field +',' + common.upsert_insert_fields_string_builder('source', @fields) +');
    '


    exec(@sql)







    CREATE function [common].[upsert_insert_fields_string_builder](@source nvarchar(100), @fields nvarchar(200))
    returns nvarchar(1000)
    as
    begin
    declare @string nvarchar(max)

    select @string = coalesce(
            @string + ',' + @source + '.' + items,        
            @source +'.' + items) 
    from common.split_string(@fields,',')

    return @string  
    end







    CREATE function [common].[upsert_update_fields_string_builder](@source nvarchar(100), @target nvarchar(100), @fields nvarchar(200))
    returns nvarchar(1000)
    as
    begin
    declare @string nvarchar(max)

    select @string = coalesce(
            @string + ', '+ @target + '.' + items + '=' + @source + '.' + items,        
            ''+ @target +'.' + items + '='+ @source +'.' + items) 
    from common.split_string(@fields,',')

    return @string  
    end
...