T-SQL Добавить столбец в определенном порядке - PullRequest
15 голосов
/ 03 июня 2010

Я немного новичок в T-SQL, исходя из фона MySQL. Я все еще приспосабливаюсь к различным нюансам в синтаксисе.

Я ищу добавить новый столбец ПОСЛЕ определенного. Я обнаружил, что AFTER является допустимым ключевым словом, но я не думаю, что оно подходит для работы.

ALTER TABLE [dbo].[InvStockStatus]
ADD [Abbreviation] [nvarchar](32) DEFAULT '' NOT NULL ;

Это мой текущий запрос, который работает хорошо, за исключением того, что он добавляет поле в конце таблицы, я бы предпочел добавить его после [Name]. Какой синтаксис я ищу, чтобы представить это?

Ответы [ 8 ]

23 голосов
/ 03 июня 2010

Вы не можете так делать

например, если у вас есть такая таблица

create table TestTable(id1 int,id3 int)

и вы хотите добавить еще один столбец id2 между id1 и id3, тогда вот что SQL Server делает за сценой, если вы используете конструктор

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_TestTable
    (
    id1 int NULL,
    id2 int NULL,
    id3 int NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_TestTable SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.TestTable)
     EXEC('INSERT INTO dbo.Tmp_TestTable (id1, id3)
        SELECT id1, id3 FROM dbo.TestTable WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.TestTable
GO
EXECUTE sp_rename N'dbo.Tmp_TestTable', N'TestTable', 'OBJECT' 
GO
COMMIT

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

select col1,col2,col3 from table
6 голосов
/ 29 апреля 2011

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

Однако база данных не существует в вакууме. Всегда найдется человек, который захочет прочитать схему таблицы (dbas, devs) и обойти ее, а также поддерживать или писать запросы к ней.

В прошлом я использовал соглашения для столбцов таблицы, например, порядок таблицы с

  1. первичные ключи сначала
  2. тогда внешние ключи
  3. затем часто используемые столбцы
  4. затем другие столбцы
  5. и, наконец, связанные с аудитом столбцы

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

Если вы действительно беспокоитесь о порядке с точки зрения читабельности, вы должны создавать свои собственные представления «читабельности» (возможно, в другой схеме) в любом порядке, который вам нравится. У вас может быть несколько представлений одной и той же таблицы (одно только для основных столбцов, а другое - с элементами, которые обычно не актуальны).

Было бы неплохо иметь возможность изменять порядок столбцов в диаграммах базы данных SQL Server (только для отображения), но это невозможно.

5 голосов
/ 03 июня 2010

Последовательность столбцов действительно неактуальна в строгом (функциональном) смысле, в любой СУБД - это просто "тонкость", которую нужно иметь для документации или людей, на которые можно посмотреть.

SQL Server не поддерживает какие-либо команды T-SQL для какого-либо упорядочивания столбцов. Так что в T-SQL нет синтаксиса для этого.

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

2 голосов
/ 03 июня 2010

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

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

2 голосов
/ 03 июня 2010

Инструменты сравнения схем, которые я видел, создадут новую таблицу с желаемым порядком, а затем скопируют данные из старой таблицы в новую (с некоторой магией переименования, чтобы новая напоминала старую). Учитывая, насколько неуклюжий этот подход, я полагаю, что нет инструкции T-SQL для добавления нового столбца в определенном месте.

1 голос
/ 24 июня 2011

Это безопасный обходной путь без использования временной таблицы. После добавления столбца в конце просто перейдите в SQL Sever Management Studio. Нажмите на таблицу, выберите -> Дизайн (или Изменить) и перетащите последний столбец в нужное место .

Таким образом, вам не нужно беспокоиться о потере данных и индексов. Единственный другой вариант - воссоздать таблицу, что может быть проблематично, если у вас большие данные.

Этот ответ предназначен для помощи другим людям и не предназначен для принятия в качестве ответа.

1 голос
/ 03 июня 2010

Технически, или, может быть, я должен сказать, академически, порядок, в котором столбцы добавляются в таблицу, или порядок, в котором они хранятся в модели внутреннего хранения базы данных, не должен вас беспокоить. Вы можете просто перечислить столбцы в предложении Select ваших SQL-запросов, чтобы управлять порядком, в котором столбцы или вычисляемые выражения появляются в выходных данных любого запускаемого вами запроса. Внутренне база данных может хранить фактические данные любым способом, который сочтет целесообразным для оптимизации хранения, и / или помогает выровнять элементы данных с границами диска и / или памяти.

0 голосов
/ 19 января 2015

Со времени опубликования этого вопроса прошло немало времени, но стоит отметить, что хотя исходный сырой код SQL для размещения столбцов в определенном порядке не изменил процесс генерации сценариев, для этого необходимо позаботиться о том, чтобы вы выбираете использовать инструменты данных SQL Server в Visual Studio для управления вашей базой данных. База данных, в которую вы развертываете, всегда будет иметь столбцы в том порядке, который вы указали в своем проекте.

...