Создайте новую таблицу из существующей таблицы для каждого отдельного значения определенного столбца и назовите новую таблицу этим отдельным значением
У меня есть таблица в базе данных SQL Server, из которой мне нужно создать разные таблицы для каждого уникального значения конкретного столбца.
Вот изображение существующей таблицы -
Existing_Table Column_1 Column_2 Column_3 A XYZ Group1 B ABC Group2 C CBA Group1 D PQR Group3 E XXX Group2 F ABC123 Group1
Таким образом, уникальные значения, для которых мне нужно будет создать новую таблицу, будут -
UNIQUE Column_3 Group1 Group2 Group3
Теперь вновь созданные таблицы ожидаемо будут выглядеть так-
New_Table_Group1 Column_1 Column_2 A XYZ C CBA F ABC123
New_Table_Group2 Column_1 Column_2 B ABC E XXX
New_Table_Group3 Column_1 Column_2 D PQR
Здесь имя таблицы будет основано на уникальном значении, на основе которого создается таблица.
Не смог добиться этого. Может ли кто-нибудь, пожалуйста, помочь достичь ожидаемого результата? Любая помощь очень ценится.
Что я уже пробовал:
Я попробовал следующий код-
DECLARE @i int DECLARE @numrows int DECLARE @indexcount int DECLARE @Group varchar(200) DECLARE @temp_table TABLE ( idx smallint Primary Key IDENTITY(1,1), Group varchar(200) ) -- populate group table INSERT @temp_table SELECT distinct Column_3 FROM Existing_Table -- enumerate the table SET @i = 1 SET @numrows = (SELECT COUNT(*) FROM @temp_table) SET @indexcount = (SELECT MAX(idx) FROM @temp_table) IF @numrows > 0 WHILE (@i <= @indexcount) BEGIN -- get the next Group primary key SET @Group = (SELECT Group FROM @temp_table WHERE idx = @i); IF OBJECT_ID('dbo.New_Table_@Group', 'U') IS NOT NULL DROP TABLE dbo.New_Table_@Group; select Column_1, Column_2 into New_Table_@Group from Existing_Table where Column_3 = @Group; -- increment counter for next Column_3 group value SET @i = @i + 1 END
Это не удается, потому что он создает только одну новую таблицу по имени "New_Table_@Group" сам и не заменяет ожидаемое уникальное значение из предполагаемого столбца и, следовательно, не создает новую таблицу для каждого уникального значения предполагаемого столбца.
CHill60
Почему ты хочешь это сделать?
shreessmrv
Это требование для того, над чем я работаю. Эти новые таблицы будут использоваться различными приложениями для дальнейшей обработки.
CHill60
Есть по крайней мере два лучших подхода
1. Сделайте так, чтобы другие приложения получили доступ к исходной таблице, или (лучше)
2. Создание Просмотры это фильтр таблицы на основе группы.
Это очень плохая практика, чтобы создать дублирующую информацию, как это
shreessmrv
Согласованный. Но в моем сценарии это неосуществимо. приложение нуждается в вводе данных только в определенном формате с заранее определенным набором полей. Базовая таблица содержит больше деталей, поэтому приложение не принимает ее и, следовательно, не выполняет ожидаемую задачу. Только после проверки всего этого мы пришли к этому плану создания различных эксклюзивных таблиц.
CHill60
Вы только что описали точную причину наличия взглядов (это также противоречит тому, как вы описали свою проблему). Все, что вы описываете, может быть достигнуто с помощью представлений без дублирования данных.
Для вызывающего приложения не должно быть очевидного различия между запросом представления и запросом таблицы.
Если приложение не "принимает" результаты запроса к таблице (или представлению), то возникает проблема с приложением. Например, возможно использование "SELECT * FROM ..." - это очень плохая практика. Перечислите необходимые столбцы.
shreessmrv
Ахилл, Ах! Есть одна проблема. Вы рассказывали о минусах. о создании нескольких таблиц и скорее выборе представлений. Ладно, я это понял! Но у меня нет проблем с созданием таблицы или представления как такового. На самом деле моя проблема заключается в динамическом создании одного из них для каждого существующего и будущих значений конкретного столбца. Так что я отвечал с другой точки зрения!
Значения столбцов, на основе которых мне нужно создать таблицы или представления, будут получать свои значения динамически. Поэтому независимо от того, создаю ли я таблицы или представления, я хочу знать, как их создать, и да, это должно происходить для любых будущих значений, которые получит столбец. Если вы поможете мне достичь этого, это будет более полезно. :)
Herman<T>.Instance
поставить [] вокруг @ - это переменная
Лучше:
Объявить @TableName NVARCHAR(200)
Набор ДБО @Имятаблицы ='.New_Table_'+ [@Группа]
Если OBJECT_ID([@TableName], 'U') не равен NULL
DROP TABLE [@TableName]
Herman<T>.Instance
Что должна делать эта часть?
выберите Column_1, Column_2
в группу New_Table_@
из Existing_Table, где Column_3 = @Group;
попытка поместить данные в таблицу без каких-либо столбцов?
shreessmrv
Эта часть предназначена для создания новых таблиц (подход select-into-создание таблиц с использованием столбцов из существующей таблицы).
Это создаст новую таблицу для каждого уникального значения Column_3, назвав таблицы в формате 'New_Table_[@Group]' со столбцами Column_1, Column_2, где Column_3= [@Group]
Herman<T>.Instance
А сейчас это работает?
shreessmrv
К сожалению, нет! Это дает мне ошибку "недопустимое имя столбца" -
Msg 207, Уровень 16, состояние 1, процедура sp_Tables_For_Group, строка 25
Недопустимое имя столбца "@Group".
Msg 207, Уровень 16, состояние 1, процедура sp_Tables_For_Group, строка 26
Недопустимое имя столбца "@TableName".
Herman<T>.Instance
смотрите цитаты в моем примере:
Объявить @TableName NVARCHAR(200)
Набор ДБО @Имятаблицы ='.New_Table_'+ [@Группа]
shreessmrv
Да, я использовал его именно так, как вы предлагали. Я не пропустил цитаты.