Добавление столбцов в таблицу изменяет sql представления. Sql добавление в таблицу столбца


Добавить новый столбец в таблицу большой базы данных MS SQL Server

Да, это в высшей степени выполнимо.

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

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

Как это работает в целом:

+---------------------+------------------------+-----------------------+ | Column is Nullable? | Default Value Supplied | Result | +---------------------+------------------------+-----------------------+ | Yes | No | Quick Add (caveat) | | Yes | Yes | Long running lock | | No | No | Error | | No | Yes | Long running lock | +---------------------+------------------------+-----------------------+

Предостережение:

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

Edit -> @MartinSmith указал, что растровое изображение NULL будет расширяться только при изменении строки, большое спасибо. Однако, как он также указывает, если размер строки расширяется за пределы байта 8060 в SQL Server 2012, тогда может потребоваться длительная блокировка . Большое спасибо * 2.

Вторая оговорка:

Попробуй это.

Третье и окончательное предупреждение:

На самом деле, не проверяйте.

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

USE [MyDB] GO ALTER TABLE [dbo].[Customer] ADD [CustomerTypeId] TINYINT NULL GO ALTER TABLE [dbo].[Customer] ADD CONSTRAINT [DF_Customer_CustomerTypeId] DEFAULT 1 FOR [CustomerTypeId] GO DECLARE @batchSize bigint = 5000 ,@rowcount int ,@MaxID int; SET @rowcount = 1 SET @MaxID = 0 WHILE @rowcount > 0 BEGIN ;WITH upd as ( SELECT TOP (@batchSize) [ID] ,[CustomerTypeId] FROM [dbo].[Customer] (NOLOCK) WHERE [CustomerTypeId] IS NULL AND [ID] > @MaxID ORDER BY [ID]) UPDATE upd SET [CustomerTypeId] = 1 ,@MaxID = CASE WHEN [ID] > @MaxID THEN [ID] ELSE @MaxID END SET @rowcount = @@ROWCOUNT WAITFOR DELAY '00:00:01' END; ALTER TABLE [dbo].[Customer] ALTER COLUMN [CustomerTypeId] TINYINT NOT NULL; GO

ALTER TABLE [dbo].[Customer] ADD [CustomerTypeId] TINYINT NULL изменяет только метаданные (замки Sch-M) и время блокировки не зависит от количества строк в таблице

После этого я заполняю новый столбец по умолчанию небольшими порциями (5000 строк). Я жду одну секунду после каждого цикла, чтобы не блокировать таблицу слишком агрессивно. У меня есть идентификатор столбца int в качестве основного кластерного ключа

Наконец, когда заполняется весь новый столбец, я меняю его на NOT NULL

Никто не может сказать, сколько времени будет стоить операция, так как это зависит от многих факторов.

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

Механизм Database Engine использует блокировку модификации схемы (Sch-M) во время работы с языком определения данных таблицы (DDL), например, добавление столбца или отбрасывание таблицы. В то время, когда он удерживается, блокировка Sch-M предотвращает параллельный доступ к таблице. Это означает, что блокировка Sch-M блокирует все внешние операции до тех пор, пока блокировка не будет отпущена.

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

РЕДАКТИРОВАТЬ:

Здесь вы можете найти дополнительную информацию о своем вопросе. Как правило, Matt Whitfield прав и

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

и когда

Новый столбец имеет значение NULL с по умолчанию NULL. Метаданные таблицы записывают тот факт, что новый столбец существует, но не может быть в записи. Вот почему нулевой битмап также имеет количество столбцов в этой конкретной записи. SQL Server может решить, присутствует ли столбец в записи или нет. Итак – это НЕ операция с размером данных – существующие записи таблицы не обновляются при добавлении нового столбца. Записи будут обновляться только тогда, когда они будут обновлены для какой-либо другой операции.

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

sqlserver.bilee.com

sql-server - Динамическое добавление столбца в таблицу Temp в Ms Sql Server?

На сервере Sql я пишу процедуру, и я использую одну таблицу тем и курсор и динамически добавляю один столбец к этой временной таблице, но он дает erro:

(10 row(s) affected) Msg 213, Level 16, State 1, Procedure USP_F_Roll_AllIndia_Report, Line 27 Column name or number of supplied values does not match table definition.

Это мой пророк:

alter procedure USP_F_Roll_AllIndia_Report (@segcode int,@rollplanyear int) as begin declare @cfcode varchar(10) declare @cfname varchar(30) declare @SQl nvarchar(max) create table #TEP (productcode varchar(10) collate database_default,proddesc varchar(100)) declare db_cursor cursor for select distinct canfm.CFCode, SUBSTRING (CANFM.CFName,4,5)as CFName from Tbl_F_CandF_M CANFM left outer join Tbl_F_Org_CandF_T CT on CANFM.CFCode = ct.CFCode where CANFM .status =1 and ct.Status =1 order by canfm.cfcode open db_cursor fetch next from db_cursor into @cfcode, @cfname while @@FETCH_STATUS =0 begin set @SQL ='alter table #TEP add '+@cfname+' float' exec sp_executesql @Sql --exec ( @Sql) insert into #TEP select pd.productcode,PM.productdesc,convert(varchar,sum(isnull(AmendedQty,isnull(Quantity,0))))as quantity from Tbl_F_Roll_PlanDetails_T pd left outer join Tbl_F_ProductMaster_M PM on pd.ProductCode =pm.ProductCode left outer join Tbl_F_CandF_M CANDF on pd.CandFLocation =CANDF.CFCode where pd. RollPlanYear =@rollplanyear and pd.CandFLocation =@cfcode and pd.ProductCode in ( select ProductCode from Tbl_F_Segment_Product_t where SegCode =@segcode ) group by pd.ProductCode,pm.ProductDesc fetch next from db_cursor into @cfcode, @cfname end close db_cursor deallocate db_cursor select * from #TEP end источник поделиться

qaru.site

Блог о веб-разработке

Небольшие доработки по сайту иногда требуют вставки новых столбцов в таблицу базы данных MySQL. Речь идет о столбце, который необходимо добавить в какую-либо таблицу базы данных посредством консоли. Давайте рассмотрим несколько примеров добавление столбцов. Для вставки новых столбцов в MySQL есть команда ALTER TABLE ADD, про использование которой я буду говорить далее.Если у вас был опыт работы с SQL запросами, то наверняка вам не составит большого труда разобраться что тут и к чему.

Синтаксис:

ALTER TABLE table_name ADD field_name parameters;

Описание параметров использованных в запросе:table_name — название таблицы;field_name — название столбца;parametrs — параметры поля;

В параметрах столбца обязательным является указание типа данных.Попробуем вставить в таблицу t_posts столбец tags текстового типа.

ALTER TABLE t_posts ADD tags TEXT;

Новый столбец tags будет добавлено по умолчанию в конец таблицы. Чтобы столбец оказался в начале таблицы необходимо добавить ещё один ключевой параметр — FIRST.

ALTER TABLE t_posts ADD tags TEXT FIRST;

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

ALTER TABLE t_posts ADD tags TEXT AFTER comments;

После выполнение команды в таблицу t_post будет добавлен столбец типа TEXT после столбца description.

Есть возможность вставлять сразу несколько столбцов, указав их через запятую.

ALTER TABLE t_post ADD tags TEXT, ADD preview_text TEXT, ADD detail_text TEXT

Команда предполагает добавление столбцов tags, prevew_text, detail_text типа TEXT.

По аналогии с указанием размещения после других столбцов.

ALTER TABLE t_post ADD tags TEXT AFTER comments, ADD preview_text TEXT AFTER views;

Столбец tags будет добавлен после столбца comments, а столбец preview_text будет добавлен после столбца views.

yournet.kz

sql - добавление столбца в таблицу Oracle SQL, которая является случайной выборкой из другого столбца/таблицы

Вот один из подходов. Я полагаю, что ваша таблица RANDNUM10 имеет много строк (больше строк, чем MYORIGTABLE), вы хотите сэмплировать случайные числа без замены (выберите случайные значения DISTINCT из RANDNUM10) - и поэтому таблица случайных чисел имеет достаточно строк - по крайней мере, столько же, сколько MYORIGTABLE - и вам нужно добавить столбец в результирующий набор запроса SELECT, а не в хранимую таблицу. (Если вам нужно сохранить результат в дополнительном столбце, вы должны сначала добавить столбец, если он еще не существует, и использовать запрос SELECT ниже в UPDATE.)

Стратегия проста: сопоставьте произвольные номера строк с меньшей таблицей (со значениями 1, 2,..., N, где N - количество строк) и сопоставьте номера случайных строк с строками в таблице случайных чисел. Оба могут быть выполнены с помощью ROW_NUMBER()... - первый из них можно упорядочить по NULL так как вся необходимая нам случайность будет поступать из других номеров строк таблицы. Затем СОЕДИНЯЙТЕ две таблицы номера строки, добавленные таким образом в обе таблицы.

Для иллюстрации я создал MYORIGTABLE как копию SCOTT.EMP, выбрав только несколько столбцов из этой таблицы. Вот как выглядит запрос, а выход - с помощью MYORIGTABLE.

Настройка:

create table myorigtable as select empno, ename, job, deptno from scott.emp; create table randnum10 ( randval ) as select dbms_random.value() from dual connect by level <= 1000;

Запрос и вывод:

select a.empno, a.ename, a.job, a.deptno, b.randval from ( select empno, ename, job, deptno, row_number() over (order by null) as rn from myorigtable ) a inner join ( select randval, row_number() over (order by dbms_random.value()) as rn from randnum10 ) b on a.rn = b.rn ; EMPNO ENAME JOB DEPTNO RANDVAL ----- ---------- --------- ------- ---------- 7369 SMITH CLERK 20 .991998901 7499 ALLEN SALESMAN 30 .448133242 7521 WARD SALESMAN 30 .136242235 7566 JONES MANAGER 20 .443347421 7654 MARTIN SALESMAN 30 .836931008 7698 BLAKE MANAGER 30 .361437867 7782 CLARK MANAGER 10 .433786615 7788 SCOTT ANALYST 20 .285173363 7839 KING PRESIDENT 10 .063840361 7844 TURNER SALESMAN 30 .825888729 7876 ADAMS CLERK 20 .818415041 7900 JAMES CLERK 30 .150180080 7902 FORD ANALYST 20 .442389099 7934 MILLER CLERK 10 .086995415

qaru.site

sql - Добавление столбцов в таблицу изменяет sql представления

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

SQL:

SELECT dbo.AccessCustomFieldDepartment.AccessCustomFieldDepartmentID, dbo.AccessCustomFieldDepartment.AccessCustomField_StoreID, dbo.AccessCustomFieldDepartment.AccessCustomField_ShopOwner, dbo.AccessCustomFieldDepartment.AccessCustomField_CVRnumber, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToWed, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToThu, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToFri, dbo.AccessCustomFieldDepartment.AccessCustomField_OpenMonToTue, --.. --a bunch of other fields --.. dbo.AccessUser.AccessUserAddress, dbo.AccessUser.AccessUserAddress2, dbo.AccessUser.AccessUserZip, dbo.AccessUser.AccessUserCity, dbo.AccessUser.AccessUserCountry, dbo.AccessUser.AccessUserWeb FROM dbo.AccessUser INNER JOIN dbo.AccessCustomFieldDepartment ON dbo.AccessUser.AccessUserID = dbo.AccessCustomFieldDepartment.AccessCustomFieldDepartmentID

Когда код других людей делает динамический столбец добавления в таблицу AccessUser, сервер или что-то изменяет sql представления!

EG:

dbo.AccessUser.AccessUserCountry, dbo.AccessUser.AccessUserWeb

изменяется на

dbo.AccessUser.AccessUserCountry AS AccessUserCity, dbo.AccessUser.AccessUserWeb AS AccessUserCountry

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

Удаление столбца магически изменяет sql обратно на оригинал.

Итак, вопрос:

  • Что происходит? Это сервер? Некоторые функции в CMS (где функция поля добавления)
  • Могу ли я настроить параметр в представлении, чтобы он учитывал статику sql 100%?

Привет,

Стин

задан Steen 26 апр. '12 в 10:31 источник поделиться

qaru.site

Добавление столбцов в таблицу (табличные службы SSAS)

 

В этом разделе описано добавление столбцов в существующую таблицу.

Если производится импорт данных из таблицы источника данных с помощью мастера импорта таблиц, то в модели создается новая таблица, которая включает все столбцы исходной таблицы или, если пользователь выбирает фильтрацию некоторых столбцов с помощью функции «Просмотр и фильтрация», только эти столбцы и выбранные с помощью фильтра данные. Можно также создать SQL-запрос, который будет возвращать только столбцы, предназначенные для импорта. Позже может выясниться, что в исходной таблице есть дополнительные столбцы, которые нужно добавить в таблицу модели, или потребуется добавить вычисляемый столбец со значениями формул DAX.

Например, при начальном импорте данных из источника данных с помощью параметра «Просмотр и фильтрация» был выполнен импорт ограниченного числа столбцов исходной таблицы, а позже выяснилось, что нужно добавить еще один столбец, который существует в исходной таблице, но еще не существует в таблице модели. Или, например, новый столбец AdjustedProfit был добавлен в таблицу FactSales в источнике данных, и теперь нужно добавить такой же столбец AdjustedProfit с теми же данными в таблицу Sales модели.

В таких случаях можно в диалоговом окне «Изменение свойств таблицы» выбрать столбцы исходной таблицы и добавить их в таблицу модели. Диалоговое окно «Изменение свойств таблицы» включает окно предварительного просмотра таблицы. Окно предварительного просмотра таблицы показывает таблицу в источнике. Столбцы, уже включенные в таблицу модели, отмечены флажками. Столбцы, еще не включенные в таблицу модели, флажками не отмечены. Чтобы добавить столбцы из источника в определение таблицы модели, достаточно выбрать столбец и нажать кнопку «ОК». Окно предварительного просмотра таблицы в диалоговом окне «Изменение свойств таблицы» обеспечивает то же самое представление и те же самые функции, что и окно предварительного просмотра таблицы на странице «Просмотр и фильтрация» в мастере импорта таблиц.

 Важно

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

 Примечание

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

Добавление столбца из источника данных с помощью диалогового окна «Изменение свойств таблицы»
  1. В конструкторе моделей выберите таблицу, в которую необходимо добавить столбец, и в меню Таблица выберите пункт Свойства таблицы.

  2. В диалоговом окне Изменение свойств таблицы в окне предварительного просмотра таблицы выберите столбец исходной таблицы, который необходимо добавить, и нажмите кнопку «ОК». Столбцы, уже включенные в таблицу модели, будут отмечены флажками.

В вычисляемом столбце формула DAX используется для вычисления значения для каждой строки. Например, можно создать вычисляемый столбец с помощью простой формулы (=1), которая прибавляет единицу к каждой строке. Вычисляемые столбцы могут иметь и более сложные формулы, которые вычисляют значения на основе других данных модели. Вычисляемые столбцы более подробно описаны в других темах. Дополнительные сведения см. в разделе Вычисляемые столбцы (табличные службы SSAS).

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

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

  2. В строке формул введите формулу DAX для добавления атрибутов для каждой строки.

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

Создание пустого именованного столбца
  1. В представлении данных конструктора моделей выберите таблицу, в которую необходимо добавить пустой столбец, прокруткой перейдите в самый правый столбец или в меню Столбец выберите пункт Добавить столбец.

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

  2. Щелкните верхнюю ячейку, введите имя и нажмите клавишу ВВОД.

Диалоговое окно "Изменение свойств таблицы" (службы SSAS) Изменение сопоставлений фильтров таблиц, столбцов и строк (табличные службы SSAS)

technet.microsoft.com