Курсор SQL Server Динамический SQL Неверный синтаксис рядом с SOURCE.dbo.SRC_KLIENT - PullRequest
0 голосов
/ 13 апреля 2019
declare kursor cursor for 
    select 
        exec_No, insert_type, stg_table, src 
    from 
        METADATA.dbo.METADATA 
    order by 
        exec_No asc;

    declare @insert_type varchar(15), @stg_table varchar(30), 
            @src varchar(80), @SQL varchar(254), @exec_No numeric(2), 
            @SQL_INSERT varchar(254);

    open kursor

    fetch next from kursor into @exec_No, @insert_type, @stg_table, @src;

    while @@FETCH_STATUS = 0
    begin
        if @insert_type = 'select' 
        begin
            --  select @SQL = 'IF OBJECT_ID('''+@stg_table+''') IS NOT NULL DROP TABLE '+@stg_table;
            select @SQL = 'DROP TABLE IF EXISTS '+@stg_table;
            select @SQL_INSERT = 'select * from '''+@src+''' as '+@stg_table;
            exec(@SQL);
            execute(@SQL_INSERT);

            fetch next from kursor into @exec_No, @insert_type, @stg_table, @src;
        end 

        if @insert_type = 'bulk'
        begin
            execute ('truncate table ' + @stg_table);
            execute('BULK INSERT '+@stg_table+' 
                     FROM ''' + @src + ''' 
                     WITH
                         (
                            FIELDTERMINATOR = '',''
                         )')
        end

        fetch next from kursor into @exec_No, @insert_type, @stg_table, @src;
    end

    close kursor;
    deallocate kursor;

и я получаю ошибки

Сообщение 102, уровень 15, состояние 1, строка 1
Неверный синтаксис рядом с SOURCE.dbo.SRC_KLIENT.

Сообщение 102, Уровень 15, Состояние 1, Строка 1
Неверный синтаксис рядом с 'SOURCE.dbo.SRC_MIEJSCOWOSC'.

Сообщение 102, Уровень 15, Состояние 1, Строка 1
Неверный синтаксис рядом с 'ИСТОЧНИК.dbo.SRC_PRACOWNIK '.

Сообщение 102, уровень 15, состояние 1, строка 1
Неверный синтаксис рядом с' SOURCE.dbo.SRC_MELDUNEK '.

Ошибки генерируютсязаявление:

select @SQL_INSERT = 'select * from '''+@src+''' as '+@stg_table;

мои вставки для метаданных:

insert into 
METADATA.dbo.METADATA(exec_No,src,stg_table,temp_table, chd_table, insert_type) 
values(1,'SOURCE.dbo.SRC_KLIENT', 'STAGE.dbo.STG_KLIENT', 'TEMP.dbo.TEMP_KLIENT', 'CHD.dbo.KLIENT', 'select');

insert into 
METADATA.dbo.METADATA(exec_No,src,stg_table,temp_table, chd_table, insert_type) 
values(15,'SOURCE.dbo.SRC_MELDUNEK', 'STAGE.dbo.STG_MELDUNEK', 'TEMP.dbo.TEMP_MELDUNEK', 'CHD.dbo.MELDUNEK', 'select');

Есть идеи, как заставить это работать?

Спасибо, ребята!

1 Ответ

0 голосов
/ 13 апреля 2019

Я наконец-то сделал это.Есть рабочий (сейчас я знаю, что это небезопасно) код:

declare 
    kursor cursor for select exec_No, insert_type, stg_table, src from METADATA.dbo.METADATA order by exec_No ASC;
    declare @insert_type varchar(15), @stg_table varchar(30), @src varchar(80), @SQL varchar(254), @exec_No numeric(2), @SQL_INSERT varchar(254);
    open kursor
    fetch next from kursor
    into @exec_No, @insert_type, @stg_table, @src;

    WHILE @@FETCH_STATUS = 0
        begin
            if @insert_type = 'select' 
            begin
                select @SQL = 'DROP TABLE IF EXISTS '+@stg_table;
                select @SQL_INSERT = 'select * into ' + @stg_table + ' from ' + @src;
                print(@SQL);
                print(@SQL_INSERT);
                exec(@SQL);
                exec(@SQL_INSERT);
            end 
            if @insert_type = 'bulks'
            begin
            execute ('truncate table ' + @stg_table);
            execute('BULK INSERT '+@stg_table+' 
                        FROM ''' + @src + ''' 
                        WITH
                        (
                        FIELDTERMINATOR = '',''
                        )')
            end
            fetch next from kursor
            into @exec_No, @insert_type, @stg_table, @src;
        end

    CLOSE kursor;
    deallocate kursor;

В SQL Server select * from table_1 as table_2 неверный запрос.Правильный - select * into table_2 from table_1.

Также были дублированные блоки 'fetch next ...' (один внутри первого, если другой снаружи если).

Спасибо за помощь, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...