Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
Требуется периодически менять значение "по умолчанию" одного из полей таблицы. Имя таблицы, поля, а также самого "CONSTRAINT", естественно известны и постоянны. Сейчас это делается двумя командами:

прибили старый
ALTER TABLE DayTraffic DROP CONSTRAINT DF_DayTraffic_DateOutput

завели новый
ALTER TABLE DayTraffic ADD CONSTRAINT DF_DayTraffic_DateOutput DEFAULT '2012-09-19' FOR DateOutput

где DF_DayTraffic_DateOutput - имя CONSTRAINT
DayTraffic - имя таблицы
DateOutput - имя поля


Вопрос (только сильно не пинайте). Что будет если я сразу сделаю что-то типа:

UPDATE syscomments SET [Text]='2012-09-19' WHERE id=(SELECT id FROM sysobjects WHERE name='DF_DayTraffic_DateOutput')

Про то, что "не хорошо" лазить и напрямую апдейтить системные таблицы - не повторяйте. Я эту команду по этой причине даже не пробовал запускать.
19 сен 12, 10:02    [13186566]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
IMOL
Вопрос (только сильно не пинайте). Что будет если я сразу сделаю что-то типа:

UPDATE syscomments SET [Text]='2012-09-19' WHERE id=(SELECT id FROM sysobjects WHERE name='DF_DayTraffic_DateOutput')

Будет сообшение от сервера о невозможности изменения системных таблиц
19 сен 12, 10:07    [13186596]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
То есть попробовать можно :).... Типа от "дураков" защита есть?
19 сен 12, 10:16    [13186643]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Не нужно никакой возни с констрейнтами и системными таблицами
use tempdb;
go

create table dbo.ColumnsDefaults
(
 cd_TableName sysname not null,
 cd_ColumnName sysname not null,
 cd_Value sql_variant not null,
 constraint PK_ColumnsDefaults primary key (cd_TableName, cd_ColumnName) 
);
go

create function dbo.ufnGetColumnDefault
(
 @cd_TableName sysname,
 @cd_ColumnName sysname
)
returns sql_variant
as
begin
 return (select cd_Value from dbo.ColumnsDefaults where cd_TableName = @cd_TableName and cd_ColumnName = @cd_ColumnName)
end;
go

create table dbo.TestTable
(
 i int not null default cast(dbo.ufnGetColumnDefault('dbo.TestTable', 'i') as int),
 d datetime not null default cast(dbo.ufnGetColumnDefault('dbo.TestTable', 'd') as datetime)
);
go

insert into dbo.ColumnsDefaults
values
 ('dbo.TestTable', 'i', 1),
 ('dbo.TestTable', 'd', cast('20120101' as datetime));

insert into dbo.TestTable default values;

update dbo.ColumnsDefaults
 set
  cd_Value = 2
where
 cd_TableName = 'dbo.TestTable' and cd_ColumnName = 'i';
 
insert into dbo.TestTable default values;

select * from dbo.TestTable;
go

drop table dbo.TestTable;
drop function dbo.ufnGetColumnDefault;
drop table dbo.ColumnsDefaults;
go
19 сен 12, 10:44    [13186891]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Как могла возникнуть такая кривая задача - то и дело менять объект БД (CONSTRAINT)??
Подозреваю, где-то там имеется INSERT, который не заботится о значении некоего поля,
которое-таки должно получать разные значения при INSERTе в разное время.

Не правильнее ли исправить этот кривой INSERT?
Чтобы он вставлял в это поле именно те значения, которые нужны?
19 сен 12, 10:52    [13186962]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
iap, Вы абсолютно правильно подозреваете. Есть "кривой" INSERT. Точнее, "BULK INSERT". И поля (даты) в загружаемом текстовом файле нет. Более того, его туда нетрудно записать. Вопрос только в том, что СЕЙЧАС этот процесс (формирования текстового файла) мы не имеем возможности остановить (а точнее нет возможности отладки формирования нового файла, тестирования и т.д.). Кроме этого, есть некие сомнения на счет замедления работы команды "BULK INSERT" при появлении в текстовом файле еще одного поля. Объем текстового файла при этом (как ни странно) вырастет на около 50%. Скорость сейчас приемлимая и на случай, если из-за раздувания текстового файла скорость INSERT-а замедлится, то отрабатываются некие другие варианты. Но в любом случае, спасибо за ответ.
19 сен 12, 11:11    [13187151]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
IMOL
"BULK INSERT". И поля (даты) в загружаемом текстовом файле нет.

Кто-то запускает BULK INSERT с опцией
KEEPNULLS
Specifies that empty columns should retain a null value during the bulk-import operation, instead of having any default values for the columns inserted.
19 сен 12, 11:16    [13187208]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
Да, прошу прощения.

Еще "в догонку". Очередной файл (кстати, с огромным количеством строчек), загружаемый командой "BULK INSERT", имеет ПОСТОЯННОЕ значение поля по всем строчкам. То есть, первое, что приходит в голову, зачем его туда писать, увеличивая объем этого файла и терять время на операциях считывания одного и того же значения с файла на диске? Не лучше ли значение этого поля задать как-то прямо в таблице, например, в виде Default-ового значения для каждого загружаемого файла? Думаю, логика понятна :)?
19 сен 12, 11:18    [13187236]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
IMOL
Не лучше ли значение этого поля задать как-то прямо в таблице, например, в виде Default-ового значения для каждого загружаемого файла? Думаю, логика понятна :)?

Ага. И менять Default при смене файла ?
19 сен 12, 11:20    [13187260]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
Glory, вопрос состоит не в том, чтобы "перескочить" значения NULL, а в том (см. чуть ниже), что значение этого поля имеется и оно ПОСТОЯННО для всех 30000 строчек загружаемого текстового файла. Апдейтить это поле после загрузки каждого файла постоянным значениям - глупо. Команда проходит очень долго.
19 сен 12, 11:23    [13187301]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
Glory
Ага. И менять Default при смене файла ?


Ну, да... :). Потому и вопрос задаю. Схема, которая описана в моем первом сообщении, сейчас работает и все устраивает...
19 сен 12, 11:25    [13187324]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104760
IMOL
Glory, вопрос состоит не в том, чтобы "перескочить" значения NULL, а в том (см. чуть ниже), что значение этого поля имеется и оно ПОСТОЯННО для всех 30000 строчек загружаемого текстового файла. Апдейтить это поле после загрузки каждого файла постоянным значениям - глупо. Команда проходит очень долго.

Ничего не понял
Если в файле уже есть поле, то чего еще не хватает ?
Нельзя что ли поле из файла добавить в поле таблицы ?
Для чего еще что-то мутить с Default-ми ?
19 сен 12, 11:25    [13187326]     Ответить | Цитировать Сообщить модератору
 Re: Изменение Default поля в таблице  [new]
IMOL
Member

Откуда:
Сообщений: 98
Glory
Ничего не понял
Если в файле уже есть поле, то чего еще не хватает ?
Нельзя что ли поле из файла добавить в поле таблицы ?
Для чего еще что-то мутить с Default-ми ?



Прошу прощения за сумбурное выражение мыслей :).

Это как в "Особенностях национальной охоты" - "...его там нет, а на самом деле оно там есть..." :).

Сейчас в загружаемом текстовом файле этого поля НЕТ и оно НЕ ГРУЗИТСЯ командо "BULK". Но само значение (постоянное для всего файла) этого поля известно. И это известное значение мы заносим прямо уже в саму таблицу в MS SQL в виде Default-оаого значения. Можно, как предлагали товарищи, записать это постоянное значение в текстовый файл, загружать все командой "BULK" и не "париться" с переустановкой DEFAULT для каждого нового текстового файла.
19 сен 12, 11:37    [13187449]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить