2008-12-29 2 views
2

Недавно моя компания провела миграцию данных (в базе данных SQL Server 2005), и мы заметили, что некоторые таблицы, созданные с помощью SELECT INTO, не поддерживали вычисленные поля исходных таблиц, но вместо этого SQL Server создал регулярные поля с типом, возвращаемым исходным расчетом. Например, предположим, что у вас есть эта таблица:SQL Server: сохранение вычисленных полей с помощью SELECT INTO

create table Example (
id int not null, 
quantity decimal(19,5) not null, 
price decimal(19,5) not null, 
total as price*quantity 
) 

после выполнения SELECT * INTO example2 из примера вы получите:

create table Example2 (
id int not null, 
quantity decimal(19,5) not null, 
price decimal(19,5) not null, 
total decimal(38,9) null 
) 

Я зафиксировал его падение плохих полей и воссоздавать их, но я хочу знать, есть ли способ поддерживать вычисленные поля в таблице, созданной с помощью SELECT INTO (возможно, с некоторой специальной конфигурацией SQL Server или с использованием альтернативной команды SQL).

Заранее спасибо.

ответ

2

Я не думаю, что вы могли бы сделать это с помощью SELECT INTO. Также, как если бы вы выбирали против представления, он просто принимает результаты и накачивает их на новый стол.

Сначала вам нужно создать таблицу с вычисленными столбцами, а затем выполнить обычную вставку из исходной таблицы не вычисляемых столбцов.

+0

Спасибо, я предположил, что, но я хочу получить больше мнений, прежде чем обсуждать проблему с моим боссом. –

0

Я понимаю, что новая таблица создана из типов данных в наборе записей. Однако набор записей не содержит информации о том, как генерируются результирующие значения, поэтому формула вычисления теряется. (как крайний пример, подумайте о представлении, содержащем GROUP BY в качестве источника для SELECT INTO)

1

В качестве политики лучше избегать использования SELECT INTO для создания таблиц, особенно при миграции. Вы не только потеряете вычисления, вы потеряете индексы, триггеры и, возможно, любые значения по умолчанию или ограничения. В процессе миграции вы всегда должны записывать таблицы, которые хотите переместить, включая триггеры, индексы и т. Д.

+0

Спасибо за подсказку, мы не используем триггеры (пока) в этой базе данных, но проигрывать индексы, конечно, не очень хорошо. –

+0

Несмотря на то, что вы теряете объекты вычислений и ограничений, вы не теряете идентичность или недействительность. –

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