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

Откуда: Санкт-Петербург
Сообщений: 131
Всем привет.

Задача такова. Есть 2 базы, в одной есть таблица1, в другой ее нет. Мне нужна возможность создавать эту таблицу из скрипта, в независимости от структуры этой таблицы. То есть, запускать не скрипт создания таблицы с жестко заданными полями и прочими атрибутами, а скрипт получения текста создания этой таблицы основанный на текущем состоянии таблицы в базе. Это нужно для того, что бы в независимости от промежуточных изменений таблицы в базе1, я мог создать такую же ( на момент создания ) в базе2. Для создания процедур я вижу возможным использовать поле text в sys.syscomments, определения же таблиц там нет.

2 слова о том, зачем мне это, дабы убедиться, что верной дорогой иду:
есть репликация таблицы, с одной базы на другую. Таблица существует в источнике, но не существует в получателе. На таблице висят несколько дефаулт констрейнтов. Часть из них должна быть перенесена ( как newsequentialid y PK ). Часть - нет. Следовательно опцией репликации переносить/не переносить дефаулты воспользоваться нельзя: если переносить, то удалить лишнии нельзя ибо таблица учавствует в репликации, да и удалять нужно только после того как произошла хотя бы 1 синхронизация ( иначе нечего удалять будет ); если не переносить, то создавать опять же, нужно лишь после синхронизации и 1 раз, это придется делать в ручную - следовательно, не подходит.
Поэтому я вижу выход в предварительном создании таблицы в получателе и репликации уже в готовую таблицу с нужными констрейнтами. Проблема в том, что если на источнике вчера была таблица1 и для нее сгенерирован скрипт создания, а сегодня вы удаляете какое то одно поле и добавляете его снова ( минимум, а может вообще посчитаете его лишним ) - репликация работать не будет. Не знаю почему, возможно, это моя недоработка, но репликация зависит и от соответствия порядка полей в источнике и назначении.
Так как я создаю скрипт на долгие времена, я не могу гарантировать что таблица-источник не изменится, а следовательно жесткое определение полей не сработает.
Так я пришел к мысли о динамическом создании.

Microsoft SQL Server 2005 - 9.00.4035.00 (X64) Nov 24 2008 16:17:31 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

Merge Replication with filter
Option " Delete data. If article has a row filter, delete only data that matches the filter. " is used.

Ваши мысли?
17 сен 09, 12:41    [7672428]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Оу, ребята.

Это работает:

select top 0 *
into DB_source.dbo.T_Table
from DB_destination.dbo.T_Table

Идентичную структуру создает на раз..

Если появятся альтернативные пути - велкам, будет интересно узнать.
17 сен 09, 13:12    [7672717]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Source и Destination поменять местами, естественно. Прошу прощения.
17 сен 09, 13:14    [7672733]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Glory
Member

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

Это работает:

select top 0 *
into DB_source.dbo.T_Table
from DB_destination.dbo.T_Table

Идентичную структуру создает на раз..


Структура - это не только поля таблицы. Но еще индексы, триггера, ограничения.
Кстати и вычисляемые поля таблицы из DB_source превратятся в обычные в DB_destination
17 сен 09, 13:44    [7673040]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
select * from  INFORMATION_SCHEMA.COLUMNS
select * from  INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
помоему есть все необходимо ?
-------------------------------------
Jedem Das Seine
17 сен 09, 13:46    [7673056]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Konst_One
Member

Откуда:
Сообщений: 11513
не всё
17 сен 09, 13:48    [7673078]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Konst_One,

я знаю, но дальше найти помоему не сложно ведь
17 сен 09, 13:49    [7673088]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx,

+ совершено недавно біла самописная скриптовалка здесь на форуме
17 сен 09, 13:50    [7673092]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Glory,
согласен. Структура полей - более подходящий термин, хотя и тут можно спорить. В первом посте я пытался объяснить, что как раз ВСЮ структуру и не нужно создавать. Поэтому подобное решение превосходно подходит. Индексы, тригеры и констрейнты создаются выборочно в том же скрипте на шаг ниже.
Благодарю.
17 сен 09, 13:54    [7673125]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Папуша Дмитрий
Glory,
согласен. Структура полей - более подходящий термин, хотя и тут можно спорить. В первом посте я пытался объяснить, что как раз ВСЮ структуру и не нужно создавать. Поэтому подобное решение превосходно подходит

А как же вычисляемые поля ?
17 сен 09, 13:58    [7673157]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание таблицы.  [new]
Папуша Дмитрий
Member

Откуда: Санкт-Петербург
Сообщений: 131
Боюсь, что никак. При наличие вычисляемых полей - этот вариант выходом являться не будет. Сейчас же мне повезло и можно ограничиться этим им. В идеале же, как я успел понять из всего прочитанного, нужно формировать строку, проходя по нужным ( их еще придется установить ) системным таблицам, отбрасывая ненужные объекты, если таковые имеются.
Уверен, что это уже реализовано кем-либо и не раз, но в данный момент я не могу вплотную заниматься поисками/изучением такого решения.
Glory, спасибо, я мог бы разбить себе лоб с этим решением в более сложной ситуации.

Благодарю.
17 сен 09, 14:45    [7673577]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить