2015-06-04 2 views
-1

У меня есть таблица с именем raw_data, которая содержит столбец с большой строкой полей данных, отформатированных в строках фиксированной длины. У меня также есть таблица table_1, которая определяет имя столбца и диапазон данных в строке для каждого значения. Мне нужно создать инструкцию SQL INSERT для перемещения данных с raw_data в таблицу с именем table_2 со всеми столбцами. table_1 имеет около 600 строк, поэтому мне интересно, могу ли я пропустить каждую запись, чтобы создать инструкцию SQL, которая вставляет данные в table_2.Использование определения столбцов столбцов для создания запроса на ввод

Table_1 
    Name Start Length 
    AAA  1  2 
    BBB  3  3 
    CCC  6  1 

Я не научился использовать курсоры; приведенный ниже запрос может быть неправильным. В этой задаче будет задействовано 3 таблицы. table_1 для поиска имени, начала, значений длины. table_2 будет таблицей, в которую мне нужно вставить данные. Третья таблица raw_data имеет столбец с подстроками каждого необходимого значения.

DECLARE @SQL VARCHAR(200) 
    DECLARE @NAME VARCHAR(200) 
    DECLARE @START VARCHAR(200) 
    DECLARE @LENGTH VARCHAR(200) 
    SET @NAME = '' 

    DECLARE Col_Cursor CURSOR FOR 
    SELECT Name, Start, Length FROM ODS_SIEMENS_LAYOUT WHERE RecordType = '1' 

    OPEN Col_Cursor 
    FETCH NEXT FROM Col_Cursor INTO @NAME, @START, @LENGTH 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    SET @SQL = @NAME + '=' + 'SUBSTRING(RAW_DATA,' + @START + ',' + @LENGTH + ')' 
    FETCH NEXT FROM Col_Cursor INTO @NAME, @START, @LENGTH 
    END 


    CLOSE Col_Cursor 
    DEALLOCATE Col_Cursor 

Мне нужно создать что-то вроде ниже запроса:

INSERT INTO TABLE_2 
'AAA' = SUBSTRING(RAW_DATA,1,2)   
'BBB' = SUBSTRING(RAW_DATA,3,3)    
'CCC' = SUBSTRING(RAW_DATA,5,2)    
........ 

Могу ли я цикл через каждую колонку, чтобы сформировать заявление SQL вместо ручного кодирования 600 столбцов?

+2

Куда нужна петля? – Xedni

+4

Стол с 600 колонками ??? Вы слышали о нормализации? –

+0

Ну, абсурдно, что у вас 600 столбцов в одном столе. Это прямо выводит; «Грозный». Но вы можете использовать sys.columns, затем используйте курсор над таблицей temp, в которую вы можете выбрать их. – Hozikimaru

ответ

1

В Рискуя Clippy ... похоже, вы пытаетесь импортировать плоский файл. Где-то ваш RAW_DATA из плоского файла? Если так что вы можете посмотреть в использовании массовой вставки:

Use a Format File to Bulk Import Data

Если вы только вопрос, как вы можете построить заявление SQL, используя данные из вашей таблицы определения столбца ... то код у вас есть очень близко , Вы хотите что-то вроде этого:

DECLARE @COLUMNS varchar(max) 
DECLARE @SUBCOLUMNS varchar(max) 
DECLARE @NAME VARCHAR(200) 
DECLARE @START VARCHAR(200) 
DECLARE @LENGTH VARCHAR(200) 
SET @NAME = '' 

DECLARE Col_Cursor CURSOR FOR 
SELECT Name, Start, Length FROM ODS_SIEMENS_LAYOUT WHERE RecordType = '1' 

OPEN Col_Cursor 
FETCH NEXT FROM Col_Cursor INTO @NAME, @START, @LENGTH 

set @SUBCOLUMNS = '' 
set @COLUMNS = '' 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @COLUMNS = @COLUMNS + @NAME + ',' 
SET @SUBCOLUMNS = @SUBCOLUMNS + 'SUBSTRING(RAW_DATA,' + @START + ',' + @LENGTH + '),' 
FETCH NEXT FROM Col_Cursor INTO @NAME, @START, @LENGTH 
END 


CLOSE Col_Cursor 
DEALLOCATE Col_Cursor 

set @COLUMNS = LEFT(@COLUMNS, len(@COLUMNS)-1) --get rid of last comma 
set @SUBCOLUMNS = LEFT(@SUBCOLUMNS, len(@SUBCOLUMNS)-1) --get rid of last comma 
print 'INSERT INTO TABLE_2 ' + '(' + @COLUMNS + ') SELECT ' + @SUBCOLUMNS + ' FROM RawDataTable' 

Вы можете взять текст, который печатает и вставить этот SQL заявление в вашу процедуру, которая делает фактические вставки.

+0

Необработанные_файлы поступают из плоского файла, но уже хранятся как максимум 1500 символов в таблице. Идея для части курсора заключается в том, что мне не нужно вручную вводить все коды. Будет 11 разных RecordType с примерно 1300 строк, что означает, что мне приходится вручную печатать 1300 строк. Я надеюсь, что курсор автоматически просмотрит все столбцы и свернет запрос. Существует 3 таблицы, один для поиска (имеет имя, начало, длину), один для выбора (таблица поиска сообщает диапазон значений подстроке из этой таблицы raw_data), последняя - это вставка в таблицу. – user1804925

+0

Ах, вы просто хотите сгенерировать синтаксис SQL для инструкции insert, используя таблицу определения столбца? Я обновил свой ответ, чтобы показать вам, как это сделать. –

+0

Максимальное текстовое ограничение для MS, поэтому текст был отключен. Если я хочу каждый раз вставлять один статут, как я могу это сделать? EX: INSERT INTO TABLE (Name1) SELECT SUBSTRING (#, #) FROM RawDataTable и продолжайте повторять шаг, пока не достигнете последнего имени столбца. – user1804925

1

Ahh Я думаю, что я начинаю распутывать то, что вы пытаетесь сделать. Здесь вообще нет необходимости в курсоре или динамическом sql. Вам просто нужно использовать оператор select в качестве значений для вашей вставки. Что-то вроде этого, может быть?

INSERT INTO TABLE_2(AAA, BBB, CCC) 
SELECT SUBSTRING(RAW_DATA,1,2)   
, SUBSTRING(RAW_DATA,3,3)    
, SUBSTRING(RAW_DATA,5,2)  
FROM ODS_SIEMENS_LAYOUT 
WHERE RecordType = '1' 
+0

Спасибо за ответ, идея для части курсора - мне не нужно вручную вводить все коды. Будет 11 разных RecordType с примерно 1300 строк, что означает, что мне приходится вручную печатать 1300 строк. Я надеюсь, что курсор автоматически просмотрит все столбцы и свернет запрос. – user1804925

+0

Зачем вам печатать 1300 строк? Небольшая модификация вышеприведенного для каждого типа записи должна делать это. –

Смежные вопросы