Копировать столбец в существующую таблицу с помощью SQL - PullRequest
1 голос
/ 09 ноября 2011

Я хочу создать столбец в databaseA с тем же именем, типом, длиной и точностью, что и другой столбец в databaseB .

Мне нужно что-то вроде этого:

INSERT INTO dbo.databaseA(col_name)
SELECT col_name
FROM dbo.databaseB;
GO

Но * col_name * еще не существует в databaseA . Я хочу создать его с тем же типом, что и * 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 столбца, который мне нужно скопировать.

Edit: ** Я использую SQL Server 2008 R2 **

1 Ответ

1 голос
/ 10 ноября 2011

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

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'

Вам нужно будет подключиться к базе данныхB, заменить o.name = 'B' именем таблицы и заменить c.Name = 'ColumnName' именем столбца.

Получив тип данных, вам нужно будет создать оператор DDL, чтобы добавить столбец в таблицу в базе данных A, что-то вроде следующего:

ALTER TABLE dbo.MyTableName ADD MyColumnName DATA_TYPE_HERE

После обновления таблицы вы можете создать и выполнить оператор вставки:

INSERT INTO DatabaseA.dbo.MyTableName (column list) 
SELECT (column list) 
FROM DatabaseB.dbo.MyTableName

Обратите внимание, что в приведенном выше примере предполагается, что обе базы данных расположены в одном и том же экземпляре SQL Server, и обе они находятся в схеме dbo.

Если это то, что вы планируете использовать в будущем, вам следует добавить несколько шагов защитного программирования, чтобы убедиться, что вы добавляете столбец только в том случае, если столбец еще не существует в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...