Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Содержит ли поле выборки значение по умолчанию?  [new]
ByDefault
Guest
.. для произвольной таблицы. При условии, что для всех полей таблицы в DDL задано default-значение. Т.е. нужно проверить, равно ли значение поля значению по умолчанию. Гугл выдает только о том, как задать значение по умолчанию, но тут мы и сами с усами, а вот как проверить?
8 май 14, 13:09    [15990823]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ByDefault
Гугл выдает только о том, как задать значение по умолчанию, но тут мы и сами с усами, а вот как проверить?

Взять значение по-умолчанию из объявления таблицы и сравнить со значением поля ?
8 май 14, 13:12    [15990856]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
ByDefault
Guest
Glory
Взять значение по-умолчанию из объявления таблицы и сравнить со значением поля ?

Ну в общем да, только надо бы обойтись без хардкодинга значений по умолчанию в условия сравнения.
Ну, например:
create table dbo.test (
  name varchar(10) default('0')
)

Есть данные о значениях по умолчанию в INFORMATION_SCHEMA.COLUMNS, но там текстовое значение, получаемое через object_definition(default_constraint_id), а default_constraint_id берется из sys.columns.default_object_id. Хочется какую-либо функцию, которой скормив на вход значение и имя таблицы+имя поля/default_constraint_id, на выходе получить 1/0 (совпадает с умолчанием/не совпадает), как-то так.
8 май 14, 13:35    [15991143]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ByDefault
Хочется какую-либо функцию, которой скормив на вход значение и имя таблицы+имя поля/default_constraint_id, на выходе получить 1/0 (совпадает с умолчанием/не совпадает), как-то так.

Поля parent_column_id int ID of the column in parent_object_id to which this default belongs
разве не хватает для этого ?
8 май 14, 13:47    [15991227]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ByDefault
Хочется какую-либо функцию, которой скормив на вход значение и имя таблицы+имя поля/default_constraint_id, на выходе получить 1/0 (совпадает с умолчанием/не совпадает), как-то так.


так в общем случае это вообще невозможно. ну, например, если в default стоит getdate().
только для констант (ну, или выражений, составленных из констант) можно что-то сравнить. а константу и из object_definition констрейнта вытянуть несложно.
8 май 14, 13:58    [15991337]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
ByDefault
Guest
daw,

да, этот момент я забыл упомянуть: все умолчания константные.
daw
а константу и из object_definition констрейнта вытянуть несложно.

Парсингом текста DDL констрейнта?
8 май 14, 14:22    [15991521]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ByDefault
Парсингом текста DDL констрейнта?

Вы запрос к sys.default_constraints вообще делали ?
Описание в хелпе читали ?
8 май 14, 14:25    [15991552]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
ByDefault
Guest
Пардон, постингом выше описка: не DDL, а definition, но от этого не легче.
Glory
Вы запрос к sys.default_constraints вообще делали ?
Описание в хелпе читали ?

Разумеется. Всё, что я могу получить из sys.default_constraints - это значение поля definition, которое nvarchar(max). Хотя в хелпе и пишут, что The semantics of the decoded expression are equivalent to the original text - все равно остается вопрос кастинга полученной подстроки в нужный тип данных (и только потом сравнения). В динамическом sql я это могу сделать вполне однозначно, а вот в запросе - вряд ли в общем случае.
8 май 14, 14:40    [15991689]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ByDefault
Разумеется. Всё, что я могу получить из sys.default_constraints - это значение поля definition, которое nvarchar(max). Хотя в хелпе и пишут, что The semantics of the decoded expression are equivalent to the original text - все равно остается вопрос кастинга полученной подстроки в нужный тип данных (и только потом сравнения). В динамическом sql я это могу сделать вполне однозначно, а вот в запросе - вряд ли в общем случае.

Для приведенного вами в этой теме примера в этом поле будет ('0')
Вам этого недостаточно что ли ?
8 май 14, 14:43    [15991716]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ByDefault,

> все равно остается вопрос кастинга полученной подстроки в нужный тип данных (и только потом сравнения).
> В динамическом sql я это могу сделать вполне однозначно, а вот в запросе - вряд ли в общем случае.

да забудьте вы об "общих случаях". количество типов данных в ms sql не так уж велико. надо только не cast к нужному типу делать в зависимости от типа данных столбца, а и каст и сравнение - тогда и без динамики можно. типа:
case when тип = int then case when cast(... As int) = <значение в столбце> then 1 else 0 end
...
8 май 14, 14:52    [15991803]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
ByDefault
Разумеется. Всё, что я могу получить из sys.default_constraints - это значение поля definition, которое nvarchar(max). Хотя в хелпе и пишут, что The semantics of the decoded expression are equivalent to the original text - все равно остается вопрос кастинга полученной подстроки в нужный тип данных (и только потом сравнения). В динамическом sql я это могу сделать вполне однозначно, а вот в запросе - вряд ли в общем случае.

а если приводить оба значения к строкам одинаковым способом и сравнивать уже строки?
8 май 14, 14:53    [15991806]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Может, в транзакции просто сделать INSERT DEFAULT в поле таблицы,
достать полученное значение в табличную переменную OUTPUTом, а транзакцию откатить?
8 май 14, 14:58    [15991844]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
ByDefault
Guest
Glory
Для приведенного вами в этой теме примера в этом поле будет ('0')
Вам этого недостаточно что ли ?

Это же всего лишь пример. Вполне возможно такое:
create table dbo.test(
  dt datetime default '20140101'
)

- следовательно, уже нужно будет вытаскивать тип столбца, и выполнять приведение типа. А еще может быть такое:
create table dbo.test(
  n binary(2) default 0x0102
)

- я получу строку '0x0102', и для приведения типа придется еще использовать стиль приведения (а на 2005-м сервере придется преобразовывать через xquery, т.к. нет поддержки стилей для binary). В общем, почти всё это, конечно, решаемо... простыней кода с кучей кейсов на все частные случаи. Но, видимо, другого выхода нет.
8 май 14, 14:59    [15991848]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Glory
Member

Откуда:
Сообщений: 104751
ByDefault
- следовательно, уже нужно будет вытаскивать тип столбца, и выполнять приведение типа.

И в чем проблема с этим ?
8 май 14, 15:01    [15991860]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
ByDefault
Guest
iap
Может, в транзакции просто сделать INSERT DEFAULT в поле таблицы,
достать полученное значение в табличную переменную OUTPUTом, а транзакцию откатить?

Мне проверка нужна в запросе, вне запроса такое вполне нормально решается динамикой.
8 май 14, 15:01    [15991863]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ByDefault,

есть тип SQL_VARIANT,
можно также приводить к NVARCHAR(), ибо к нему всё можно привести.

SELECT CONVERT(NVARCHAR(MAX),'Строка',126)
8 май 14, 15:05    [15991903]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8821
А в чём смысл этой задачи кроме академического?
8 май 14, 15:05    [15991908]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
iap
ByDefault,

есть тип SQL_VARIANT,
можно также приводить к NVARCHAR(), ибо к нему всё можно привести.

SELECT CONVERT(NVARCHAR(MAX),'Строка',126)


беда в том, что definition для defaulta - это _уже_ строка. а, к примеру, одинаковые значения datetime можно записывать разными строками.

так что да - простыня с case-ами.
8 май 14, 15:09    [15991942]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Glory
Member

Откуда:
Сообщений: 104751
daw
а, к примеру, одинаковые значения datetime можно записывать разными строками.

И как эти разные строки будут конвертироваться при разных настройках коннекта ?
8 май 14, 15:10    [15991953]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Glory
daw
а, к примеру, одинаковые значения datetime можно записывать разными строками.

И как эти разные строки будут конвертироваться при разных настройках коннекта ?


о, кстати да. если в default для datetime константа записана в виде, который по-разному в зависимости от настроек коннекта может интерпретироваться, то решения тоже нет.
8 май 14, 15:19    [15992014]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А ещё пока не отменили дефолтные объекты
(которые CREATE DEFAULT)
C ними что делать?
8 май 14, 16:12    [15992363]     Ответить | Цитировать Сообщить модератору
 Re: Содержит ли поле выборки значение по умолчанию?  [new]
Гузы
Guest
ByDefault
daw,

да, этот момент я забыл упомянуть: все умолчания константные.
daw
а константу и из object_definition констрейнта вытянуть несложно.

Парсингом текста DDL констрейнта?


Ну зачем же парсингом:
declare @tr nvarchaR(MAX)
select @tr=definition from [sys].[default_constraints]
where object_id = xxxxxxxxxx
exec  ('select '+@tr)
8 май 14, 16:51    [15992599]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить