sql >> データベース >  >> Database Tools >> SSMS

SSMS:Excelからデータをインポート(コピー/貼り付け)する方法

    次のPROCを使用してください:

    CREATE PROCEDURE dbo.p_values2insertquery
        @t_name   nvarchar(128),                   -- Destination Table Name + [(column names)]
        @t_values nvarchar(max),                   -- Paste Table Values here (from excel for instance)    
        @dlm      nvarchar(128)   = N'  '          -- Delimiter: HT = HorizontalTab = char(9)
    AS
    /*  p_values2insertquery
            - converts table values stored in @t_values string (separated by default by @dlm=TAB)
              to queries for insert to  table name defined in @t_name
    
    
        INPUT:
            @t_name   nvarchar(128),                   -- Destination Table Name + [(column names)]
            @t_values nvarchar(max),                   -- Paste Table Values here (from excel for instance)    
            @dlm      nvarchar(128)   = N'  '          -- Delimiter: HT = HorizontalTab = char(9)
    
        -- NB! Script do NOT write any ifo to any table
        -- to perform insert please copy/paste script output and execute            
    
    
        EXAMPLE:
    
            IF OBJECT_ID('tempdb..#insertTable') IS NOT NULL DROP TABLE #insertTable;
            CREATE TABLE #insertTable
            (   transaction_id int     
               ,user_id        int 
               ,purchase_price decimal(8,2) 
               ,mess           varchar(8)
            );
    
            declare @t_name     nvarchar(128)   = '#insertTable'    -- Table Name for insert
            declare @t_values   nvarchar(max)   =                   -- Paste Table Values here (from excel for instance)
            N'                
            NULL    490366  NULL    NULL
            NULL    490400  NULL    NULL
            NULL    490402  NULL    NULL
            483061  490404  10  abc1
            NULL    490406  NULL    NULL
            9766167 490408  3   abc2'
            ;
            declare @dlm        nvarchar(128)   = char(9);          -- Delimiter: HT = char(9) = HorizontalTab
    
            exec p_values2insertquery @t_name, @t_values
    
         -- Output:
         insert into #insertTable VALUES(NULL,'490366',NULL,NULL);
         insert into #insertTable VALUES(NULL,'490400',NULL,NULL);
         insert into #insertTable VALUES(NULL,'490402',NULL,NULL);
         insert into #insertTable VALUES('483061','490404','10','abc1');
         insert into #insertTable VALUES(NULL,'490406',NULL,NULL);
         insert into #insertTable VALUES('9766167','490408','3','abc2');
    */
        select N'insert into '
                + @t_name               -- table name
                + ' VALUES(' 
                + replace               -- replace 'NULL' by NULL
                  ( '''' 
                     + replace          -- surround values by quotes 'value1','value2'...
                       (    value
                       ,    @dlm        -- Delimiter: HT = char(9) = HorizontalTab
                       ,    ''','''
                       ) 
                     + ''''
                  , '''NULL'''  
                  , 'NULL'      
                  )                                              
                + ');' as insertQuery
        --into #t 
        from string_split               -- insert Line per Row into table
             (  replace                 -- replace CR + LF by LF  (CR - Carriage Return, LF - Line Feed)
                (   @t_values           -- Paste Table Values here (from excel for instance)
                , char(13)+char(10)     -- CR + LF
                , char(10)              -- LF
                )
             ,char(10)
             ) 
        where len(value)>0              -- skip empty rows
        ;
    
    /* the same, but step by step (for explanatory purposes):
    IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t;
    
    select @t_values=replace(@t_values,char(13)+char(10), char(10))           ;    -- replace CR + LF by LF  (CR - Carriage Return, LF - Line Feed)
    select value into #t from string_split(@t_values,char(10))                ;    -- insert Line per Row into table
    delete from #t where len(value)<1                                         ;    -- delete empty lines
    
    update #t set value =  '''' + replace(value,  @dlm, ''',''') + '''';            -- surround values by quotes 'value1','value2'...
    update #t set value =      replace(value, '''NULL''', 'NULL');                  -- replace 'NULL' by NULL
    update #t set value = N'insert into '+ @t_name + ' VALUES(' + value + ');'
    
    select * from #t
    */
    RETURN 0 
    

    例:

    IF OBJECT_ID('tempdb..#insertTable') IS NOT NULL DROP TABLE #insertTable;
    CREATE TABLE #insertTable
    (   transaction_id int     
       ,user_id        int 
       ,purchase_price decimal(8,2) 
       ,mess           varchar(8)
    );
    
    declare @t_name     nvarchar(128)   = '#insertTable'    -- Table Name for insert
    declare @t_values   nvarchar(max)   =                   -- Paste Table Values here (from excel for instance)
    N'                
    NULL    490366  NULL    NULL
    NULL    490400  NULL    NULL
    NULL    490402  NULL    NULL
    483061  490404  10  abc1
    NULL    490406  NULL    NULL
    9766167 490408  3   abc2'
    ;
    declare @dlm        nvarchar(128)   = char(9);          -- Delimiter: HT = char(9) = HorizontalTab
    
    exec p_values2insertquery @t_name, @t_values
    

    出力(コピー/貼り付けして実行するだけで挿入を実行):

    insert into #insertTable VALUES(NULL,'490366',NULL,NULL);
    insert into #insertTable VALUES(NULL,'490400',NULL,NULL);
    insert into #insertTable VALUES(NULL,'490402',NULL,NULL);
    insert into #insertTable VALUES('483061','490404','10','abc1');
    insert into #insertTable VALUES(NULL,'490406',NULL,NULL);
    insert into #insertTable VALUES('9766167','490408','3','abc2');
    


    1. 2020年の最後のDBeaverEEリリース

    2. PHPMyadminはmysqlエラーメッセージを表示しません

    3. phpMyAdminがcsvから日時を正しくインポートするようにするにはどうすればよいですか?

    4. 増加する文字と数字で構成されるID番号に使用するタイプ