2009-04-20 2 views
28

Можно ли добавить столбец в таблицу в определенной порядковой позиции в SQL Server?Добавить новый столбец таблицы в определенное порядковое положение

Например, наши таблицы всегда имеют столбцы CreateOn, CreatedBy, LastModifiedOn, LastModifiedBy в конце каждого определения таблицы? Я хотел бы, чтобы новый столбец отображался в SSMS над этими столбцами.

Если я использую скрипты всех изменений в базе данных, есть ли способ сохранить этот порядок в конце таблицы?

FYI, я не пытаюсь создать пламенную войну, если это даже должно быть сделано. Если вы хотите прочитать о нити, которая вырождается быстро в том, что здесь хорошая один:

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

+0

Или это причина, по которой я должен создавать представления поверх каждой таблицы? –

+0

Связанные: http://stackoverflow.com/q/1605144/12484 –

ответ

23

Вы должны создать временную таблицу, которая отражает схему исходной таблицы, но с тем столбцом, который вы хотите, затем скопируйте содержимое оригинала на temp. Удалите оригинал и переименуйте temp.

Это то, что SQL Management Studio делает за кулисами.

С помощью средства синхронизации схемы вы можете сгенерировать эти сценарии автоматически.

+0

Таблицы Temp не могут быть переименованы за пределами 'tempdb'. –

3

Войдите в SQL Server Management Studio и создайте существующую таблицу. Вставьте столбец посередине и посмотрите на созданный им скрипт. он будет в основном создавать временную таблицу с правильным порядком столбцов, вставлять данные из исходной таблицы, удалять исходную таблицу и переименовывать временную таблицу. Это, вероятно, то, что вам нужно будет сделать.

3

Насколько я знаю, нет известного способа изменить порядок столбца. За кулисами SQL Management Studio делает то, что сказал Хосе Базилио. И если у вас есть большая таблица, тогда нецелесообразно менять порядок столбцов таким образом.

Вы можете использовать «вид». С помощью представлений SQL вы можете использовать любой понравившийся вам заказ, не затрагивая изменения столбца таблицы.

0

Вы не можете создать столбец в определенном порядковом месте в структуре таблицы - плюс, зачем вы хотите? Порядок столбцов в SQL Server абсолютно не имеет значения.

SQL Server Management Studio имеет конструктивное представление, которое, по-видимому, позволяет создавать столбец в любом месте в списке столбцов, но то, что на самом деле происходит здесь в фоновом режиме, состоит в том, что создается новая таблица с новыми столбцами и старый падает.

Нет команд SQL DDL для создания столбца в определенном месте или для «переупорядочения» столбцов. Это действительно не нужно.

Марк

+4

Зачем вам это нужно? Так что легче просматривать вещи в SSMS. Если, например, у меня есть таблица, состоящая из набора временных меток, которые продукт продвигается по фабрике, а затем, естественно, последовательно в базе данных, помогает читать данные, а не перескакивать вперед и назад. Да, это не имеет значения для кода, но это помогает уменьшить когнитивную нагрузку при попытке отладки вещей. –

+0

@Colin Mackay: Да, вот для чего нужны взгляды. Не забудьте отказаться от отладки. –

7

Ответ: Да, это технически возможно, но вы будете иметь головную боль делать это, и это займет много времени, чтобы выполнить и настроить.

One: Создать/Копировать/Drop/Переименовать

Это на самом деле то, что SQL Server делает в графическом интерфейсе: вот пример сценария его создания и выполнения при нажатии кнопки «Сохранить» после добавления нового столбца в начало таблицы.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 
BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_SomeTable 
    (
    MyNewColumn int NOT NULL, 
    OriginalIntColumn int NULL, 
    OriginalVarcharColumn varchar(100) NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON 
GO 
IF EXISTS(SELECT * FROM dbo.SomeTable) 
    EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF 
GO 
DROP TABLE dbo.SomeTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO 

GO 
COMMIT 

Два: ADD COLUMN/UPDATE/DROP COLUMN/ПЕРЕИМЕНОВАТЬ

Этот метод в основном включает в себя создание копии всех существующих столбцов, которые вы хотите добавить в 'правой' части нового столбца, перенос данных в новый столбец, затем удаление оригиналов и переименование новых. Это приведет к хаосу с любыми индексами или ограничениями, которые у вас есть, поскольку вы должны их переупорядочить. Это технически возможно, но опять же занимает много времени с точки зрения разработки и исполнения.

CREATE TABLE MyTest (a int, b int, d int, e int) 

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5) 

SELECT * FROM MyTest -- your current table 

ALTER TABLE MyTest ADD c int -- add a new column 
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move 
ALTER TABLE MyTest ADD e_new int 

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns 

ALTER TABLE MyTest DROP COLUMN d -- remove the originals 
ALTER TABLE MyTest DROP COLUMN e 

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns 
EXEC SP_RENAME 'MyTest.e_new', 'e'; 

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample 

Три: Смиритесь с этим

Это сильно оскорбляет мое чувство порядка ... но иногда это просто не стоит перетасовки.

0

TFS 2013 сделает это за вас автоматически.

Добавить новый столбец (ы) в вашу таблицу в любом случае, а затем внести изменения в TFS. Оттуда вы можете открыть sql-файл таблицы в Visual Studio и вручную переместить порядок столбцов в сценарии CREATE T-SQL. Затем вы можете обновить свою целевую базу данных с помощью инструмента сравнения схемы VS, найденного в разделе Инструменты> SQL Server> Новое сравнение схем. Выберите проект базы данных с вашими изменениями в качестве источника и базой данных, которую вы хотите обновить в качестве цели. Сравните, выберите сценарий таблицы и Update. VS автоматически упадет и добавится автоматически. Все ваши данные будут в безопасности, а также индексы.

0

Грязные и простые.
Экспорт таблицы в csv.
Вставьте новые данные в нужное положение.
Капля таблицы.
Создайте новый стол с требуемыми спецификациями столбцов.
Загрузить столбцы из csv в новый стол.

Смежные вопросы