Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1

Копия структуры таблицы

11.02.2017, 20:22. Показов 6207. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Подскажите, пожалуйста, есть ли такая штучка (например, ХП или что-то такое) в SQL Server, которая создает копию структуры имеющегося таблицы или поля таблицы?

Например, вот такой код на одном из языке программирования:

DATA:
CCNAME TYPE T001-BUTXT,
CCCURR TYPE T001.


создает следующие объекты:

строка:
CCNAME TYPE T001-BUTXT

создает переменную CCNAME с точно таким же типом данных как поле BUTXT в таблице T001

а строка:
CCCURR TYPE T001

создает таблицу, которая полностью аналогична таблице T001 (со всеми полями, типами данных, индексами и т.д. и т.п.).

Может быть есть такая ХП или функция в SQL Server ?

Это нужно было для того, чтобы, например, не надо было бы принудительно создавать таблицу\табличную переменную CCCURR через CREATE TABLE (...) при вставке значений всех полей из таблицы T001.

Например, есть таблица T001 с полями:
IDT001 с типом данных INTEGER и поле BUKRS c типом данных NVARCHAR (4)

Индексы в полях IDT001 и BUKRS. В таблице 10 строк с данными

Теперь мне надо создать табличную переменную @lv_T001 точно такой же структуры.

И для того, чтобы не писать код:

T-SQL
1
declare @lv_T001 table (IDT001 INTEGER identity(1,1), BUKRS nvarchar(4))
было бы достаточно написать что-то типа того:

DATA:
@lv_T001 TYPE T001.


чтобы потом выполнить код:

T-SQL
1
insert into @lv_bukrs select bukrs from T001
P.S.: В принципе, если в таблице 10 полей, то написать declare @lv_T001... не сложно. Но вот если в таблице 200 полей, то код получается довольно существенный и есть риск упустить что нибудь. А так было бы просто скопировать структуру таблицу в табличную переменную и всё.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2017, 20:22
Ответы с готовыми решениями:

Перестроение структуры таблицы
Есть таблица в excel по форме: Дата, Код_подразделения, , 01-01-2014, 01235, 56 678, ...

Создание структуры Таблицы
1. Создание структуры таблицы Создайте таблицу “Покупатель”, которая состоит из полей (название полей могут быть на русском языке): ...

Копия структуры меняется при изменении оригинала
Есть структура. Хочу сделать ее резервную копию, создаю структуру такого же типа и присваиваю ей значение первоночальной структуры. Далее...

23
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.02.2017, 20:59
Цитата Сообщение от RCF Посмотреть сообщение
Но вот если в таблице 200 полей
это что же за объекты такие?

получаешь скрипт создания таблицы и только имя меняешь и констрэйнты убираешь.
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
11.02.2017, 22:03  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
это что же за объекты такие?
Это у меня таблица такая с основными данными материала

Цитата Сообщение от YuryK Посмотреть сообщение
получаешь скрипт создания таблицы и только имя меняешь и констрэйнты убираешь.
ОК, кажется понимаю о чем говорите. Только подскажите, как достать этот скрипт?

Например, скрипт для моей ХП могу взять вот от сюда:

T-SQL
1
select * From syscomments
А скрип для таблицы где лежит?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.02.2017, 22:07
в контекстном меню на таблице
Миниатюры
Копия структуры таблицы  
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
11.02.2017, 22:15
Цитата Сообщение от RCF Посмотреть сообщение
Это нужно было для того, чтобы, например, не надо было бы принудительно создавать таблицу\табличную переменную CCCURR через CREATE TABLE (...) при вставке значений всех полей из таблицы T001.
В табличную переменную нельзя. В таблицу или временную таблицу можно:
T-SQL
1
select * into NewTable from MyTable;
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.02.2017, 22:18
Цитата Сообщение от invm Посмотреть сообщение
В табличную переменную нельзя.
Запрещаешь? А я так люблю ими пользоватся. Правда не на 100 полей, как у ТС
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
11.02.2017, 22:21  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
в контекстном меню на таблице
Наверно я не совсем правильно задал вопрос.

Я хотел узнать, в какой таблице в SQL Servere сохранен скрипт, который я написал, когда создавал таблицу T001 ?

Например, когда создал ХП sp_price, скрипт для этой ХП сохранился в системной таблице syscomments.

Так вот, в какой системной таблице хранится скрипт, который был написал когда создавалась таблице T001 ?

Добавлено через 2 минуты
Цитата Сообщение от invm Посмотреть сообщение
В табличную переменную нельзя. В таблицу или временную таблицу можно:
Жаль что нельзя... (((

Мне например, для того чтобы обработать 10 строк, нужно было временно строки из T001-BUKRS поместить во временную таблицу и дальше работать с этой временной таблицей...

Поэтому не хотел создавать физическую таблицу, а потом DROP его...
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.02.2017, 22:21
Он скорей всего не хранится, а генерируется на основании данных, хранящихся в системных таблицах
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
11.02.2017, 22:26  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
Он скорей всего не хранится, а генерируется на основании данных, хранящихся в системных таблицах
Жаль... ((

Придется писать свой скрипт... я думал, может есть стандартный
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
11.02.2017, 22:36
Цитата Сообщение от RCF Посмотреть сообщение
Мне например, для того чтобы обработать 10 строк, нужно было временно строки из T001-BUKRS поместить во временную таблицу
И в чем проблема? Временная таблица и табличная переменная - разные сущности. select ... into во временную таблицу можно, в табличную переменную - нельзя.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.02.2017, 22:41
Цитата Сообщение от invm Посмотреть сообщение
select ... into в табличную переменную - нельзя
есть
T-SQL
1
insert into @tbl select  ...
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
11.02.2017, 22:48
Цитата Сообщение от YuryK Посмотреть сообщение
есть
T-SQL
1
insert into @tbl select ...
И что, предварительное создание табличной переменной не требуется?
insert ... select и select ... into различаем? Или все едино?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.02.2017, 02:49
Цитата Сообщение от invm Посмотреть сообщение
И что, предварительное создание табличной переменной не требуется?
не требуется только объявление. TС хочет облегчить себе жизнь, получая текст объявления идентичный объявлению существующей таблицы.

Цитата Сообщение от invm Посмотреть сообщение
insert ... select и select ... into различаем? Или все едино?
Главное смысл: результат запроса поместить в таблицу. Сам я использую исключительно 1-ю конструкцию, но и вторая просто не резанула по глазам.
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
12.02.2017, 10:14  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
Он скорей всего не хранится
Думаешь?

Мне почему-то кажется, что скрипт создания таблицы где-то хранится, а найти вот не могу... точно так же как скрипт для ХП, например.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.02.2017, 10:25
Цитата Сообщение от RCF Посмотреть сообщение
точно так же как скрипт для ХП
скрипт ХП, фунций вьюшек понятно - там авторское форматирование текста, комментарии и прочее.
А скрипт создания таблицы всего этого лишен, поэтому хранить его в текстовом виде просто незачем.

Тем более, что и редактирование первых - это изменение этого самого текста, а редактирование структуры таблицы - это куча разных разноплановых скриптов.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
12.02.2017, 11:17
Цитата Сообщение от YuryK Посмотреть сообщение
Сам я использую исключительно 1-ю конструкцию, но и вторая просто не резанула по глазам.
Т.е. таки не различаем...
insert ... select - добавляет данные в существующую таблицу.
select ... into - создает новую таблицу и добавляет в нее данные.
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
12.02.2017, 11:57  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
А скрипт создания таблицы всего этого лишен, поэтому хранить его в текстовом виде просто незачем.
Да. С этим я разобрался.

Скрипт для таблицы можно получить вот так:

T-SQL
1
2
3
4
DECLARE @object_name SYSNAME , @object_id INT , @SQL NVARCHAR(MAX) 
  SELECT @object_name = '[' + OBJECT_SCHEMA_NAME(o.[object_id]) + '].[' + OBJECT_NAME([object_id]) + ']' , @object_id = [object_id]
  FROM (SELECT [object_id] = OBJECT_ID('dbo.T001', 'U')) o SELECT @SQL = 'CREATE TABLE ' + @object_name + CHAR(13) + '(' + CHAR(13) + STUFF(( SELECT CHAR(13) + ' , [' + c.name + '] ' + CASE WHEN c.is_computed = 1 THEN 'AS ' + OBJECT_DEFINITION(c.[object_id], c.column_id) ELSE CASE WHEN c.system_type_id != c.user_type_id THEN '[' + SCHEMA_NAME(tp.[schema_id]) + '].[' + tp.name + ']' ELSE '[' + UPPER(tp.name) + ']' END + CASE WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary') THEN '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(5)) END + ')' WHEN tp.name IN ('nvarchar', 'nchar') THEN '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(5)) END + ')' WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset') THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')' WHEN tp.name = 'decimal' THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')' ELSE '' END + CASE WHEN c.collation_name IS NOT NULL AND c.system_type_id = c.user_type_id THEN ' COLLATE ' + c.collation_name ELSE '' END + CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END + CASE WHEN c.default_object_id != 0 THEN ' CONSTRAINT [' + OBJECT_NAME(c.default_object_id) + ']' + ' DEFAULT ' + OBJECT_DEFINITION(c.default_object_id) ELSE '' END + CASE WHEN cc.[object_id] IS NOT NULL THEN ' CONSTRAINT [' + cc.name + '] CHECK ' + cc.[definition] ELSE '' END + CASE WHEN c.is_identity = 1 THEN ' IDENTITY(' + CAST(IDENTITYPROPERTY(c.[object_id], 'SeedValue') AS VARCHAR(5)) + ',' + CAST(IDENTITYPROPERTY(c.[object_id], 'IncrementValue') AS VARCHAR(5)) + ')' ELSE '' END END FROM sys.columns c WITH(NOLOCK) JOIN sys.types tp WITH(NOLOCK) ON c.user_type_id = tp.user_type_id LEFT JOIN sys.check_constraints cc WITH(NOLOCK) ON c.[object_id] = cc.parent_object_id AND cc.parent_column_id = c.column_id WHERE c.[object_id] = @object_id ORDER BY c.column_id FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 7, ' ') + ISNULL((SELECT ' , CONSTRAINT [' + i.name + '] PRIMARY KEY ' + CASE WHEN i.index_id = 1 THEN 'CLUSTERED' ELSE 'NONCLUSTERED' END +' (' + ( SELECT STUFF(CAST(( SELECT ', [' + COL_NAME(ic.[object_id], ic.column_id) + ']' + CASE WHEN ic.is_descending_key = 1 THEN ' DESC' ELSE '' END FROM sys.index_columns ic WITH(NOLOCK) WHERE i.[object_id] = ic.[object_id] AND i.index_id = ic.index_id FOR XML PATH(N''), TYPE) AS NVARCHAR(MAX)), 1, 2, '')) + ')' FROM sys.indexes i WITH(NOLOCK) WHERE i.[object_id] = @object_id AND i.is_primary_key = 1), '') + CHAR(13) + ');'
  PRINT @SQL
Добавлено через 25 минут
Цитата Сообщение от invm Посмотреть сообщение
В табличную переменную нельзя
Похоже что так. А вот во временную таблицу можно, причем получилось обрабатывать дальше в коде только в глобальную временную таблицу:

T-SQL
1
2
3
4
5
6
7
DECLARE @TableName nvarchar(max) = 'GT_T001';
DECLARE @Sql NVARCHAR(max) = 'create table ##' + @TableName + ' (BUKRS nvarchar(4), ROWG uniqueidentifier DEFAULT NEWID()  )';
EXECUTE sp_executesql @Sql
 
insert into ##GT_T001 (BUKRS) select BUKRS from T001
 
select * from ##GT_T001
Если есть идеи по локальной таблице, то прошу поделиться
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.02.2017, 11:59
Цитата Сообщение от invm Посмотреть сообщение
добавляет данные в существующую таблицу.
и в несуществующую, а просто объявленную табличную переменную (ТП). Ну значит будет ТС эту форму использовать, если вторую нельзя, тем более, что она и ни к чему, в таком случае, т.к. иногда надо подсыпать записей в ТП.

Добавлено через 2 минуты
Цитата Сообщение от RCF Посмотреть сообщение
Похоже что так
Запудрил он тебе мозги. Тебе принципиально select ... into? insert ... select религия не позволяет?
0
5 / 5 / 4
Регистрация: 24.03.2010
Сообщений: 241
Записей в блоге: 1
12.02.2017, 12:06  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
ТС
Что такое ТС ?

Цитата Сообщение от YuryK Посмотреть сообщение
Запудрил он тебе мозги. Тебе принципиально select ... into? insert ... select религия не позволяет?
Ничего он не запудрил. Все говорит правильно и не надо мне ни select ... into, ни insert ... select.

Идея была в том, что в теле ХП использовать табличные переменные, но чтобы не писать DECLATE @T001 TABLE (... и тут расписывать все 200 столбов...), а просто сослаться на таблицу T001 и всё. И тогда было бы здорово просто использовать эту табличную переменную.

Но так как с табличной переменной не проканало, придется использовать глобальную временную таблицу через ## и добавлять столбец uniqueidentifier, чтобы идентифицировать записи конкретного пользователя.

Так то так...
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.02.2017, 12:17
Понятно.
Только даже не представляю такую ХП и зачем в ней копия таблицы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2017, 12:17
Помогаю со студенческими работами здесь

полная копия таблицы
но исходная находится на другом сервере mysql как сделать получше?

Динамическое изменение структуры таблицы для организации древовиднойой структуры
Доброго времени суток. У меня такой вот вопрос: Необходимо сделать возможность добавления записей в таблицу определнным образом (через...

Массивы, структуры, таблицы. Признак конца таблицы
Здравствуйте. Я занимаюсь электроникой. Пишу программы для микроконтроллеров. Си недавно начал изучать. До этого писал на асме. Как мне...

Структуры в виде таблицы
Программа должна вывести на экран все записи в виде таблицы. Атрибуты 1. Название лекарства 2. Производитель 3. Цена ...

Изменение структуры таблицы
Добрый день. Выполняю в Delphi такой код procedure TfrmMain.btnAddClick(Sender: TObject); var index:integer; begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru