powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь по формированию таблицы
23 сообщений из 23, страница 1 из 1
Нужна помощь по формированию таблицы
    #39918643
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги!
Возникла небольшая проблемка ...
Имеется таблица, у которой в расширенных свойствах полей описаны заголовки столбцов, условия ограничения и т.д.
Хочется создать таблицу, в которой каждому полю таблицы соответствовала одна строка. Например, есть столбец1 у которого определено только имя, есть столбец2 у которого определены другие свойства...
Поле1 MSCaption Код
Поле2 MSCaption Поле2
Поле2 MSDescription Это поле2
Поле2 ValidationRule >1 and < 999
Поле3 ValidationRule >#01.01.2019# AND < #01.01.2020#
Поле3 ValidationText "Сеньёр, Вы не правы!"
Что хочется?
Создать таблицу для передачи по запросу из стороннего приложения в виде:
Поле Заголовок Описание Ограничения Сообщение_об_ошибке

Поле1 Код
Поле2 Поле2 Это поле2 >1 AND < 999
Поле3 >#01.01.2019# AND < #01.01.2020# "Сеньёр, Вы не правы!"

Причем, в столбцах, для которых нет введенного ранее значения, выводилась пустая строка ""
Т.е.

Поле Заголовок Описание Ограничения Текст

Поле1 Код "" "" ""
Поле2 Поле2 Это поле2 >1 and < 999 ""
Поле3 "" "" >#01.01.2019# AND < #01.01.2020# "Сеньёр, Вы не правы!"

Причем, если в расширенных свойствах нет описания заголовка (MSCaption), выводилось бы имя столбца из описания таблицы (Field1, Field2 ...)
Прошу помощи у уважаемого сообщества в решении моей, наверное не сильно сложной задаче.
С благодарностью ....
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39918667
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

чуток не так. Расширенные свойства надо определять у ограничения, а не у таблицы. Если возникает исключение ограничения, то информацию о таблице, столбце и ограничении можно извлечь из сообщения об ошибке. Зная "координаты" можно получить текст расширенного свойства и вернуть его клиенту.

Надо иметь в виду, что сообщения могут отличаться для разных языков подключения.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39918697
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день Владислав Колосов!
Задача стоит несколько иная. Будет приложение на С++, в котором надо отобразить таблицу.
Чтобы правильно отобразить столбцы по заголовкам и контролировать правильность ввода
на этапе формы, мне и нужно вытянуть расширенные свойства полей из таблицы.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919052
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

В таком случае, вы разрабатываете приложение с высоким уровнем связности. Например, при каких-то изменениях в базе, например, переименовании или разделении таблицы придется переписывать код приложения.

С дрогой стороны, можно перейти на более высокий уровень абстракции, т.е. вместо связи объектов использовать интерфейсы. В качестве интерфейса может выступать хранимая процедура. С помощью процедуры можно запросить описание параметров и передать эти параметры серверу, который сам определяет проверки и способ хранения.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919176
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги!
Как описывал ранее, потребовалась функция, которая возвращала бы расширенные свойства всех полей заданной таблицы.
Делается это для того, чтобы в стороннем приложении (в частности CBuilder):
1) Все столбцы имеют русское название (у кого есть - это проблема приложения)
2) Если зачесалась моя левая пятка и я поменял название столбца с "Код" на "Счетчик", то он изменится у ВСЕХ пользователей и нет необходимости править стороннее приложение.
3) Зачесалась моя правая пятка и я изменил правило на значение, оно изменится у ВСЕХ пользователей без необходимости править стороннее приложение.
4) и т.д.

Естественно, все это происходит на этапе формирования формы стороннего приложения...

Пока гуру SQL скромно обходят своим вниманием эту тему, пришлось тщательно прошерстить тырнет и скомпилировать
примеры в работоспособный пример.


SELECT * FROM (
SELECT clmns.name AS ColumnName, p.name AS ExtendedPropertyName,
CAST(p.value AS sql_variant) AS ExtendedPropertyValue
FROM sys.objects o INNER JOIN
sys.all_columns clmns ON clmns.object_id = o.object_id INNER JOIN
sys.extended_properties p ON p.major_id = o.object_id AND p.minor_id = clmns.column_id AND p.class = 1
WHERE (o.type IN ('U', 'V')) AND (o.name = 'Имя_таблицы_в_БД') AND
(p.name = 'Name' OR
p.name = 'OrdinalPosition' OR
p.name = 'Type' OR
p.name = 'Size' OR
p.name = 'MS_Caption' OR
p.name = 'MS_Description' OR
p.name = 'ValidationRule' OR
p.name = 'ValidationText') )PropTable
PIVOT (MAX(ExtendedPropertyValue) FOR ExtendedPropertyName IN ([OrdinalPosition],
[Type],
[Size],
[MS_Caption],
[MS_Description],
[ValidationRule],
[ValidationText])) AS pvt
ORDER BY CAST(OrdinalPosition AS INT) ASC;



Что имели до и после
1) Все параметры расположены в одном столбце (исходно)
2) Развернули строки по полям (выход)

Осталось найти, где хранятся соответствие кодов типов данных и их описанием (например, 8 = datetime), а также как заменить в выходном наборе данных заменить числовой код словесным описанием.
[img=]
[img=]
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919177
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не смог сразу вставить вторую картинку
Вариант после разворачивания таблицы по столбцам
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919183
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хранить заголовки библиотеки в вертикальном виде - это какой то антиsql

хранить в ненормальной форме для того, что бы потом конвертировать в нормальную

Примените пожалуйста Правило №1: если у вас что то не получается даже после гугления и подглядывания за аналогами - значит вы что то делаете совсем не так (ну или у вас супер уникальная задача, которую до вас никто не решал)


edward_sh Если зачесалась моя левая пятка и я поменял название столбца с "Код" на "Счетчик", то он изменится у ВСЕХ пользователей и нет необходимости править стороннее приложение.
Это называется "я пилю свой велосипед фреймворк". Если вы хотите абстрагироваться и хранить структуры в БД, то смотрите как устроены фреймворки на вашем языке.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919185
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, но это не я храню так, а MS SQL сервер :)
Я только пытаюсь представить их в удобоваримом виде.
Закомментируйте секцию PIVOT и убедитесь в этом...
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919188
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

так в общем-то, не делают. Если хотите создать корпоративное клиент-серверное приложение, то должны отвязать модель отображения от модели хранения. Это выполняется при помощи хранимых процедур и функций. Воле-неволей Вам потребуется найти SQL разработчика или закатать рукава самому.

Если прямо аж горит как напрямую обращаться к модели данных, то Ваше решение приемлемо. Однако если есть хоть малейшее подозрение на его масштабирование рано или поздно всё зайдёт в тупик из-за нелинейного объема изменений, который придется выполнить. Например, Вы начинаете понимать, что приложение работает медленно. Копаете, пока не обнаруживаете, что модель хранения данных, к примеру, денормализованная "простыня", требует нормализации ввиду постоянно возникающих ожиданий доступа. И вы должны пилить как клиента, так и модель данных потому, что клиент напрямую обращается к таблицам. Через некоторое время внедрение нового функционала начнет занимать полгода, затем год, затем Вы банкрот. Всё это не новости, это практика. Поищите книги о рефакторинге, в том числе о рефакторинге баз данных, там это всё отлично описано.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919190
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
поэтому я "закатал рукава" и оформил этот скрипт как хранимую процедуру.
Бизнес-логика должна хранится на сервере данных - она и храниться.
Клиентское приложение получает данные по запросу.
Управляется централизованно...
Что не так?
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919340
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Осталось найти, где хранятся соответствие кодов типов данных и их описанием (например, 8 = datetime), а также как заменить в выходном наборе данных заменить числовой код словесным описанием.
системное вью sys.types (?), поле system_type_id

... только в ней datetime не равно 8, а =61 ...
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919363
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

как-то так:

Код: sql
1.
2.
3.
4.
5.
select cc.[Name], TYPE_NAME(user_type_id) [typename], max_length, [precision],
		t1.name ExtName, t1.value ExtValue
from sys.columns cc
outer apply fn_listextendedproperty(null,'schema',OBJECT_SCHEMA_NAME(cc.object_id),'table','MY_TABLE','column',cc.[Name]) t1
where cc.[object_id] = OBJECT_ID('dbo.MY_TABLE')
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919381
Фотография StarikNavy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Владислав Колосов,

Бизнес-логика должна хранится на сервере данных - она и храниться.
...
Что не так?

она (у вас) хранится НЕПРАВИЛЬНО :)
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919383
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StarikNavy
она (у вас) хранится НЕПРАВИЛЬНО :)
ну дык... EAV всемогущий и многоликий...
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919554
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, court! Обязательно посмотрю там, возможно и оттуда возможно будет вытащить данные.
Таблица была импортирована из Access, тогда возможно, тип datatime 8 - это access кодировка типов данных.
Действительно в MS SQL datetime имеет код 61. Буду думать...
Интересно, есть ли описание "стандартных" расширенных свойств полей?
Наверняка же параметр MS_Caption не от фонаря назначается.

То Владислав Колосов - я пробовал эту функцию. Мне не удалось завернуть ее в PIVOT.
Сервер отчаянно ругался, не помню уж об чем. Поэтому и пришлось искать пути через чтение таблиц.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919560
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh
Наверняка же параметр MS_Caption не от фонаря назначается.
Назначается тем приложением, которым создавали таблицу.
Если создавать обычным create table ... - никаких расширенных свойств не будет.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919564
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh,

зачем поворот, не пойму? Результат точно такой же,как у Вас на картинках, по строке на колонку.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919572
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, понял - надо развернуть несколько расширенных свойств в колонки... Ну это как-то не очень, получите резалтсет с неопределенным количеством столбцов. Чтобы такое запрограммировать на SQL надо использовать динамический запрос или переписывать его по мере изменения таблицы. На клиенте реализовать поворот проще, по-моему.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919599
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый StarikNavy, просвятите, если не трудно, как по-фэншую должна храниться бизнес-логика?

То Владислав Колосов - доберусь до сервера - проверю Ваше предложение. Структура запроса может меняться редко и слегка подправить приложение - не проблема, динамический запрос - тема другого разговора, если в нем возникнет необходимость.
Клиент должен съесть только то, что ему отдали. Проблемы приложения, как оно его разгребет...

То buser - простите мою некомпетентность, что есть EAV?

Уважаемые джентельмены, а есть ли утилитка, которая преобразует базу access в таблицу MS SQL? Штатными средствами и access и MS SQL сервера таблицы переносятся, но все ограничения игнорируются.
Имеется проект-прикидка для миграции на SQL сервер, не хочется все свойства полей переписывать руками.
А таблиц более 40 ...
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919745
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
edward_sh

Бизнес-логика должна хранится на сервере данных - она и храниться.
Что не так?


Бизнес логика должна храниться в приложении (на бекенде), а данные - в базе данных.
Вы пытаетесь засунуть правила И логику в базу. Конечно же с благой целью flexibility, которая (цель) как обычно вымащивает дорогу известно куда.
Для больших и сложных приложений это может быть оправдано (и то, конфигурационные файлы чаще тупо удобнее), но у вас то я не уверен, что приложение на продажу и соответствующего масштаба.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39919894
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza,

не совсем понятное утверждение. Логика обработки данных - это тоже часть бизнес логики. И её удобно держать на сервере в виду хранимых процедур, отделяя обработку данных от интерфейса. Паттерн модель - представление - контроллер. Представление реализует клиентское приложение, контроллер реализует база данных (процедуры, триггеры и так далее) или совместно с сервером приложений.
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39920261
edward_sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Основная проблема, которую я хочу решить таким образом - это "автоматическое" изменение отображения данных на форме приложения (не важно на чем оно написано). Также, если я допустил где-то ляп в наложении ограничений на поля и исправил это, необходимо перекомпилировать приложения и заменить их у пользователей. Также, если ужесточились ограничения, например вместо диапазона дат 2017 - 2050 я решил ввести 2020-2050. Скомпилированное приложение, при скомпилированном коде с встроенными ограничениями честно пропустит старый диапазон дат и получит отлуп от сервера, поскольку там уже другие ограничения. Задуманное мною не ново - приложение запрашивает сервер о полях таблицы через вьюшку или процедуру. Получает в ответ как называются поля по-русски и список ограничений на поля. Прикладная программа на этапе построения формы рассовывает эти ограничения по полям. Таким образом получается "автоматическая" синхронизация правил сервер-приложение.
Согласитесь, что отлавливать ошибки на уровне ввода в форму гораздо лучше, чем отправив запрос на сервер, ожидая получить ответ от него, получаешь сообщение об ошибке.
Вторая причина не менее банальна. Я не считаю себя гуру программирования и эстетом в конструировании форм. Возможно, найдется умелец, который захочет написать свой интерфейс к БД на другом языке. И тогда мне придется каждому объяснять что как называется, чем ограничивается. А здесь все проще - запросил - получи. И делай с этим все что хочешь...
...
Рейтинг: 0 / 0
Нужна помощь по формированию таблицы
    #39921108
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
PizzaPizza,

Логика обработки данных - это тоже часть бизнес логики. И её удобно держать на сервере в виду хранимых процедур, отделяя обработку данных от интерфейса.


когда логика сложная, то может быть удобнее бекенд держать не в ХП, а как приложение с апи (да, на сервере). Тем более, если хочется гибкости, то ХП это будет многовато кода. У edward_sh желание хранить в базе всю логику и структуру, что, имхо, излишне при ему требуемом уровне абстракции - судя по всему это вполне конкретное приложение с конкретным функционалом, а не фреймворк. Просто надо писать документацию, и не будет проблем с изменением структуры и правил.

edward_sh приложение запрашивает сервер о полях таблицы через вьюшку или процедуру. Получает в ответ как называются поля по-русски и список ограничений на поля. Прикладная программа на этапе построения формы рассовывает эти ограничения по полям.


Ну так плоская таблица с ограничениями и админка для менеджмента этой таблицы будет более чем достаточно. Зачем поворачивать тут что то.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна помощь по формированию таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]