Добавить столбец в определенную позицию на сервере MSSQL. Ms sql добавить столбец


условно добавлять строки и столбцы MS SQL Server

У меня есть столбец как

-------------------------------------------------------------- | Sl. No. | bal1 | bal2 | bal3 | status1 | status2 | status3 | -------------------------------------------------------------- | 1 | 520 | 270 | 351 | 1 | 0 | 1 | | 2 | 201 | 456 | 154 | 0 | 1 | 1 | --------------------------------------------------------------

Я хотел бы добавить поле строк для значения Status = 1 в SQL Server

например. результат

-------------------- | Sl. No. | amount | -------------------- | 1 | 871 | // bal1 + bal3 as the status1 and status3 is 1 | 2 | 610 | // bal2 + bal3 as the status2 and status3 is 1 -------------------- Уровень -------------------- | Sl. No. | amount | -------------------- | 1 | 871 | // bal1 + bal3 as the status1 and status3 is 1 | 2 | 610 | // bal2 + bal3 as the status2 and status3 is 1 --------------------

Заранее спасибо.

Solutions Collecting From Web of "SQL Server: условно добавлять строки и столбцы"

вы можете сделать это с помощью CASE

SQL Fiddle

SELECT [SI. No.], (case when status1 =1 then bal1 else 0 end + case when status2 =1 then bal2 else 0 end + case when status3 =1 then bal3 else 0 end) as balance from Table1 . SELECT [SI. No.], (case when status1 =1 then bal1 else 0 end + case when status2 =1 then bal2 else 0 end + case when status3 =1 then bal3 else 0 end) as balance from Table1

Если значения status всегда будут 1 или 0, вы можете умножить и добавить:

select [Sl. No.], bal1 * status1 + bal2 * status2 + bal3 * status3 from table SELECT [Sl. No.], (case when bs.[status1] =1 then bs.bal1 else 0 end + case when bs.status2 =1 then bs.bal2 else 0 end + case when bs.status3 =1 then bs.bal3 else 0 end) as amount from BalStatus AS bs . SELECT [Sl. No.], (case when bs.[status1] =1 then bs.bal1 else 0 end + case when bs.status2 =1 then bs.bal2 else 0 end + case when bs.status3 =1 then bs.bal3 else 0 end) as amount from BalStatus AS bs

sqlserver.bilee.com

T-SQL Добавить столбец в конкретном порядке MS SQL Server

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

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

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

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

например, если у вас есть таблица, подобная этой

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

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

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

Раньше я использовал соглашения для столбцов таблицы, таких как упорядочение таблицы с

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sqlserver.bilee.com

Добавить столбец в определенную позицию на сервере MSSQL MS SQL Server

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

Даже если вопрос старый, потребуется более точное описание Management Studio.

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

Чтобы изменить порядок столбцов, вам просто нужно переместить их в Management Studio. Это не должно требовать (скорее всего, есть исключения), что Management Studio воссоздает таблицу, поскольку она скорее всего изменит координацию столбцов в определениях таблиц.

Я делал это так по многим причинам с таблицами, что я не мог добавить столбцы с графическим интерфейсом из-за данных в них. Затем переместили столбцы с помощью графического интерфейса Management Studio и просто сохранили их.

Вы пройдете от гарантированного времени до нескольких секунд ожидания.

В MSSMS выберите таблицу в проводнике объектов. Щелкните правой кнопкой мыши и выберите вариант. Это приведет к новой вкладке, где вы можете перетащить столбцы в новый порядок по умолчанию. Сохранить и престо! Готово.

Вам нужно создать другую таблицу и скопировать данные. Но посмотрите на «порядковое положение» и попробуйте обновить его?

SELECT ORDINAL_POSITION ,COLUMN_NAME ,DATA_TYPE ,CHARACTER_MAXIMUM_LENGTH ,IS_NULLABLE ,COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Product' ORDER BY ORDINAL_POSITION ASC;

Первичный ключ – это еще один вопрос, для которого вы можете найти множество ответов.

sqlserver.bilee.com

Добавить столбец в существующую таблицу SQL Server – Последствия MS SQL Server

Во-первых, как говорит marc_s, он должен влиять только на запросы SELECT * , и даже не все из них обязательно будут затронуты.

Во-вторых, вам нужно указать только все ненулевые поля в INSERT , поэтому, если вы сделаете его NULL-способным, вам не нужно беспокоиться об этом. Кроме того, для столбца Created_Date типа типично добавить параметр DEFAULT =GetDate() , который заполнит его для вас, если он не указан.

В-третьих, если вы все еще беспокоитесь о влиянии на существующую базу кода, выполните следующие действия:

  1. Переименуйте таблицу в нечто вроде «physicalTable».
  2. Создайте представление с тем же именем, что и ваша таблица, который делает SELECT .. FROM physicalTable , перечисляя столбцы явно и в том же порядке, но не включайте в M_DateModified поле M_DateModified .
  3. Оставьте ваш код немодифицированным, теперь ссылаясь на представление, вместо прямого доступа к таблице.

Теперь ваш код может безопасно взаимодействовать с таблицей без каких-либо изменений (код SQL DML не может определить разницу между таблицей и записываемым представлением, подобным этому).

Наконец, этот столбец «ModifiedDate» является общей потребностью и чаще всего обрабатывается, сначала делая его NULL-способным, а затем добавляя триггер Insert & Update, который устанавливает его автоматически:

UPDATE t SET M_DateModified = GetDate() FROM (SELECT * FROM physicalTable y JOIN inserted i ON y.PkId = i.PkId) As t

Таким образом, приложение не должно поддерживать само поле. В качестве дополнительного бонуса ни одно приложение не может установить его неправильно или ложно (это обычное и приемлемое использование триггеров в SQL).

Если новый столбец не является мандатным, вам не о чем беспокоиться. Если у вас нет некоторых knuckleheads, которые написали команды выбора с «*» вместо списка столбцов.

Ну, пока ваши SELECT не являются *, все должно быть хорошо. Для INSERT, если вы дадите поле по умолчанию GETDATE () и разрешите NULL, вы можете исключить его, и он все равно будет заполнен.

Зависит от того, как настроены ваши другие запросы. Если они SELECT [Item1], [Item2], ect …. Тогда вы не столкнетесь с какими-либо проблемами. Если это SELECT * FROM вы можете столкнуться с неожиданными результатами.

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

sqlserver.bilee.com

Эффективное добавление столбца в SQL Server MS SQL Server

Это потребует обновления кластерного индекса, да – это все-таки данные таблицы.

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

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

Марк

SQL Server – это база данных, ориентированная на строки. Это отличается от базы данных, ориентированной на столбцы. Это означает, что в SQL Server все данные для данной строки хранятся вместе на диске. Приведем пример:

Скажем, у вас есть таблица Customer с тремя столбцами: FirstName, MiddleInitial и LastName. Тогда, скажем, у вас есть 3 записи в этой таблице для Jabba T. Hutt, Dennis T. Menace и George W. Bush.

В базе данных, ориентированной на ряд (например, SQL Server), записи будут храниться на диске как таковые:

Джабба, Т, Хатт; Деннис, Т, Угроза; Джордж, У, Буш;

Напротив, база данных, ориентированная на столбцы, будет хранить записи на диске следующим образом:

Джабба, Деннис, Джордж; T, T, W; Хатт Уайнес, Буш;

Если столбцы группируются вместо строк.

Теперь, когда вы добавляете столбец в таблицу в ориентированной на строку базе данных (например, SQL Server), новые данные для каждого столбца должны быть вставлены рядом с существующими строками, сдвигая строки, требующие много чтения / записи операции. Итак, если вы должны вставить новый столбец для префикса клиента, который по умолчанию имеет значение «Mr», это то, что вы получите:

Г-н, Джабба, Т, Хатт; Г-н, Деннис, Т, Угроза; Г-н, Джордж, У, Буш;

Как вы можете видеть, все исходные данные были сдвинуты вправо. С другой стороны, когда вы вставляете новый столбец, который по умолчанию имеет значение NULL, новые данные не должны помещаться в существующие строки. Таким образом, происходит меньшее смещение, требующее меньше операций чтения / записи на диске.

Конечно, это упрощает то, что происходит на диске. Есть другие вещи, которые следует учитывать при работе с индексами, страницами и т. Д. Но это должно помочь вам получить картину.

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

sqlserver.bilee.com

Добавить столбец на SQL Server на конкретном месте? MS SQL Server

Я хотел бы знать, есть ли способ добавить столбец в таблицу SQL Server после его создания и в определенной позиции?

Благодарю.

Вы можете сделать это в Management-Studio. Вы можете проверить, как это достигается, создавая SQL-скрипт, прежде чем сохранять изменения. В основном это достигается за счет:

  • удаление всех внешних ключей
  • создание новой таблицы с добавленным столбцом
  • копирование всех данных из старого в новую таблицу
  • отбрасывание старого стола
  • переименование новой таблицы на старое имя
  • воссоздание всех внешних ключей

В дополнение ко всем остальным ответам, помните, что вы можете переупорядочивать и переименовывать столбцы в VIEW. Итак, если вам необходимо сохранить данные в одном формате, но представить их в другом, вы можете просто добавить столбец в конец таблицы и создать одно представление таблицы, которое будет переупорядочивать и переименовывать столбцы, которые вы хотите показать. Почти во всех обстоятельствах это представление будет вести себя точно так же, как и исходная таблица.

Самый безопасный способ сделать это.

  • Создайте новую таблицу с правильным порядком столбцов
  • Скопируйте данные из старой таблицы.
  • Бросьте старый стол.

Единственный безопасный способ сделать это – создать новую таблицу (со столбцом, где вы ее хотите), перенести данные, удалить исходную таблицу и переименовать новую таблицу в исходное имя.

Это то, что Management Studio делает для вас, когда вы вставляете столбцы.

Как указывали другие, вы можете сделать это, создав временную таблицу, перемещающую данные, и вытащить оригинальную таблицу, а затем переименовать другую таблицу. Но это глупо. Если ваш стол большой, для этого может потребоваться очень много времени, и пользователи будут заблокированы во время процесса. Это то, что вы НИКОГДА не хотите делать с любой таблицей в производстве.

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

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

С помощью Sql Server Management Studio вы можете открыть таблицу в дизайне и перетащить столбец туда, где хотите.

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

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

В базах данных таблиц столбцов нет порядка.

Напишите правильный оператор выбора и создайте представление

Нет.

В принципе, SSMS за кулисами скопирует таблицу, ограничения и т. Д., Удалит старую таблицу и переименует новую.

Причина проста: столбцы не предназначены для упорядочения (и не являются строками), поэтому вы всегда должны указывать, какие столбцы вы хотите в наборе результатов (выберите * – это немного взломать)

sqlserver.bilee.com

добавление столбца и классификация по категориям MS SQL Server

У меня есть таблица с transaction_id в качестве первичного ключа и также содержит customer_id который является внешним ключом.

Теперь есть type столбца, который имеет два значения: 'Card' и 'cash' .

Теперь некоторые из клиентов использовали оба метода оплаты. Я хочу добавить новый столбец и классифицировать клиентов как «Только карточку» «Только наличные» и «Оба».

Поэтому в этой таблице мне нужен новый столбец «Тип платежа», который классифицирует клиента 101 как «Оба», так как он использовал оба способа оплаты.

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

SELECT DISTINCT Table1.[Customer ID], T1.* FROM Table1 CROSS APPLY (SELECT SUM(CASE WHEN [Type] = 'Cash' THEN 1 ELSE 0 END) AS Cash, SUM(CASE WHEN [Type] = 'Card' THEN 1 ELSE 0 END) AS Card FROM Table1 T WHERE T.[Customer ID] = Table1.[Customer ID]) T1

Дает вам следующие результаты:

CUSTOMER ID CASH CARD 100 0 1 101 1 1 102 0 1 103 1 0

Вы можете использовать функции окна:

select t.*, (case when min(type) over (partition by customerid) = max(type) over (partition by customerid) then 'Only ' + min(type) over (partition by customerid) else 'both' end) from transactions t;

Вы можете сделать лучше и удалить немного дублирования (значения только наличные, а карта будет повторяться только в таблице, в этом случае мы предпочитаем повторять идентификатор). Таким образом, вы можете создать таблицу, например payement_methods которая будет иметь 2 столбца, например id и method , вы будете заполнять его тремя указанными вами параметрами (только наличные деньги, только карточкой, оба), и вы будете иметь в своей transaction table Например, столбец payment_method_id (вместо столбца типа, который вы использовали).

пример

|id | method | |1 | Cash only | |2 | Card Only | |3 | Both |

таблица транзакций

|id | other columns ...|payement method | |1 | other columns ...|1 | |2 | other columns ...|3 | //...

извините за мой английский, удачи.

Create table tran1(Transactionid int , Customerid int , Type varchar(100)) insert into tran1(Transactionid , Customerid , Type ) values (1 , 100 , 'Card ' ), (2 , 101 , 'Cash' ), (3 , 102 , 'Card ' ), (4 , 103 , 'Cash ' ), (5 , 101 , 'Card ' ) alter table tran1 add NewType varchar(100) Update tran1 set NewType ='Only card' where Customerid IN ( select d.custid from ( select Customerid as custid,SUM(case when [Type]='Card' then 1 else 0 end) card ,SUM(case when [Type]='Cash' then 1 else 0 end) cash from tran1 group by Customerid)d where d.card=1 ) Update tran1 set NewType ='Only Cash' where Customerid IN ( select d.custid from ( select Customerid as custid,SUM(case when [Type]='Card' then 1 else 0 end) card ,SUM(case when [Type]='Cash' then 1 else 0 end) cash from tran1 group by Customerid)d where d.cash=1 ) Update tran1 set NewType ='Both' where Customerid IN ( select d.custid from ( select Customerid as custid,SUM(case when [Type]='Card' then 1 else 0 end) card ,SUM(case when [Type]='Cash' then 1 else 0 end) cash from tran1 group by Customerid)d where d.card=1 and cash=1 )

sqlserver.bilee.com