#sql #sql-server-2008
#sql #sql-server-2008
Вопрос:
Я хочу создать столбец в базе данных с тем же именем, типом, длиной и точностью, что и другой столбец в базе данных.
Мне нужно что-то вроде этого:
INSERT INTO dbo.databaseA(col_name)
SELECT col_name
FROM dbo.databaseB;
GO
Но *col_name * еще не существует в базе данных. Я хочу создать его с тем же типом, что и *col_name * в DatabaseB.
Я также посмотрел на:
ALTER TABLE table_name ADD col_name data_type
INSERT INTO dbo.databaseA(col_name)
SELECT col_name
FROM dbo.databaseB;
GO
Но я не знаю data_type столбца, который мне нужно скопировать.
Редактировать: ** Я использую SQL Server 2008 R2 **
Комментарии:
1. Какого поставщика базы данных вы используете? SQL Server, Oracle, MySQL?
2. Вероятно, вам было бы гораздо удобнее просто открыть SQL Server Management Studio, подключиться к базе данных «B», просмотреть таблицу и найти тип данных столбца. Затем подключитесь к базе данных A и вручную добавьте столбец в таблицу. Как только поле окажется в таблице в базе данных A, вы можете написать свою инструкцию insert.
3. Это одноразовая вещь? Или вы ищете универсальное решение?
4. Подписались ли разработчики моделей данных и администраторы баз данных на этот подход? Обычно этим можно управлять с помощью процесса управления изменениями, используя как DDL (ALTER TABLE), так и DML для внесения изменений.
5. Вы на самом деле говорите о двух разных базах данных? Или вы имеете в виду разные таблицы ? Столбцы хранятся в таблицах, так что многое понятно, не так ли?
Ответ №1:
Вы можете получить тип данных столбца из базы данных, запросив системные представления, аналогично следующему:
SELECT c.*, s.name
FROM sys.columns c
INNER JOIN sys.objects o
ON c.object_id = o.object_id
INNER JOIN sys.types s
ON c.user_type_id = s.user_type_id
WHERE o.name = 'B'
AND c.name = 'ColumnName'
Вам нужно подключиться к DatabaseB, заменить o.name = 'B'
на имя вашей таблицы и заменить c.Name = 'ColumnName'
на имя вашего столбца.
Как только у вас будет тип данных, вам нужно будет создать инструкцию DDL для добавления столбца в таблицу в базе данных A, что-то вроде следующего:
ALTER TABLE dbo.MyTableName ADD MyColumnName DATA_TYPE_HERE
После обновления таблицы вы можете создать и выполнить инструкцию insert:
INSERT INTO DatabaseA.dbo.MyTableName (column list)
SELECT (column list)
FROM DatabaseB.dbo.MyTableName
Обратите внимание, что вышеизложенное предполагает, что обе базы данных расположены на одном экземпляре SQL Server, и они обе находятся в схеме dbo.
Если вы планируете использовать это в будущем, вам следует добавить несколько шагов защитного программирования, чтобы убедиться, что вы добавляете столбец только в том случае, если он еще не существует в таблице.