MSSQL - добавить новый столбец в функции иерархической таблицы. Ms sql добавить столбец в таблицу


sql - добавление существующего столбца в существующую таблицу MS_Access

Немного истории:

В этом проекте я пытаюсь объединить 2 таблицы, которые я получаю из разных приложений.

Одно из приложений дает мне несколько таблиц, которые я успешно объединяю в 1 таблицу:

DB_Total

Другое приложение дает мне одну таблицу с ничего, кроме тэгов. Эта таблица называется:

TagNames_EA

Теперь я хотел бы добавить столбец "Имя" из таблицы "TagNames_EA" в таблицу "DB_Total", чтобы сравнить значения в полях "Имя".

Пока у меня есть этот код для сравнения и фильтрации имен, которые не совпадают:

SELECT d.Address, d.Type, d.Name, IIf(t.Name Is Null, False, True) AS match_found FROM DB_Total AS d LEFT JOIN TagNames_EA AS t ON d.Name = t.Name;

Это отлично работает, но я также хотел бы увидеть значения "Name" из таблицы TagNames_EA в таблице DB_Total.

Я знаю, что можно добавить столбец в существующую таблицу с помощью

ALTER TABLE DB_Total ADD Names_EA

Но когда я пробую это:

ALTER TABLE DB_Total ADD Names FROM TagNames_EA AS Names_EA

Это не работает

Есть простой способ сделать это?

Edit: Я попытался упростить то, как я объяснил свою ситуацию.

Редактировать 2: Пример

В таблице "DB_Total" у меня есть список имен, которые должны быть точно такими же, как имена в таблице "EA_Names".

DB_Total: Name S1\SVS_AK\ENA[3] S1\SVS_AK\ENA[4] S1\SVS_AK\ENA[5] S1\SVS_AK\ENA[6] S1\SVS_AK\ENA[7] S1\SVS_AK\ENA[8]

Однако иногда возникают ошибки, и я хотел бы проверить, есть ли имена, которые не имеют совпадений. Как это:

TagNames_EA Name S1\SVS_AK\ENA[3] S1\SVS_AK\ENA[4] S1\SVS_AK\ENA[5] S1\SVS_AK\EMA[6] <--- This is a Mistake and will come up as a mismatch S1\SVS_AK\ENA[7] S1\SVS_AK\ENA[8]

В настоящее время используемый мной код добавляет новый столбец в мою таблицу DB_Total, либо значение "-1" (для соответствия), либо значение "0" (для имени без соответствия)

Это выглядит так:

DB_Total: Name match_found S1\SVS_AK\ENA[3] -1 S1\SVS_AK\ENA[4] -1 S1\SVS_AK\ENA[5] -1 S1\SVS_AK\ENA[6] 0 S1\SVS_AK\ENA[7] -1 S1\SVS_AK\ENA[8] -1

То, что я хотел бы выполнить, - это таблица, которая включает следующее:

DB_Total: Name Names_EA match_found S1\SVS_AK\ENA[3] S1\SVS_AK\ENA[3] -1 S1\SVS_AK\ENA[4] S1\SVS_AK\ENA[4] -1 S1\SVS_AK\ENA[5] S1\SVS_AK\ENA[5] -1 S1\SVS_AK\ENA[6] S1\SVS_AK\EMA[6] 0 S1\SVS_AK\ENA[7] S1\SVS_AK\ENA[7] -1 S1\SVS_AK\ENA[8] S1\SVS_AK\ENA[8] -1

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

любая помощь будет оценена!

qaru.site

sql-server-2008 - Как вставить отдельные столбцы таблицы XLS в таблицу MS SQL Server?

В коде внизу создается файл с инструкциями SQL, основанный на том, что в ваших xls. Вам просто нужно добавить макрос, вставить его и изменить несколько вещей (добавьте время, чтобы заполнить коллекцию ColFields строкой заголовка, где имена столбцов должны совпадать с именами полей таблицы, объявить, что нет, указать значение fileName...). Затем выполните макрос, и у вас будет файл со всей желаемой вставкой, тогда вам просто нужно будет выполнить этот файл на своей базе.

Sub Macro1() Dim NbOfLines = Worksheets(Sheet1).Range("A65536").End(xlUp).Row - 5 'Not the 5 last lines Dim ColFields As New Collection 'Do a while on the title line to fill the collection with wanted columns titles (do not add ignored columns) Dim StartSql As String StartSql = "INSERT INTO " + TableName + "(" For Each loopField In ColFields StartSql = StartSql + loopField + "," Next StartSql = Left(StartSql, Len(StartSql) - 1) StartSql = StartSql + ") SELECT " Dim Value As String For i = 1 To NbOfLines Sql = "" j = 1 For Each loopField In ColFields Value = Worksheets(SheetName).Cells(i, j).Value Sql = Sql + IIf(Value = "", "NULL", "'" + Replace(Value, "'", "''") + "'") + "," j = j + 1 Next Sql = Left(Sql, Len(Sql) - 1) Sql = StartSql + Sql + vbCrLf Call WriteLine(Sql, FileName) Next End Sub Public Sub WriteLine(Ligne As String, FileName As String) Open FileName For Append As #1 Print #1, Ligne Close End Sub

edit: Я знаю, что это не лучший метод (и не самый красивый), я дал его вам, потому что я использовал его несколько недель назад для импорта данных из БД в другой (но мне нужно было это сделать только один раз, а не каждый день). Я также знаю, что есть способ сделать это с помощью OpenRowSet, в котором вы правы, но я просто не знаю, как (я часто буду ходить на этой странице, желая, чтобы кто-то научил меня). Наконец, я рекомендую вам прочитать эту страницу: Страница блога с помощью решения (Здесь вы найдете замечательную процедуру "uftReadfileAsTable": Код процедуры) Удачи!

qaru.site

Как добавить столбец в таблицу больших sql-серверов MS SQL Server

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

Синтаксически это не проблема, и если в таблице не было так много строк и не было в производстве, это было бы легко.

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

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

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

ALTER TABLE table1 ADD newcolumn int NULL GO

не займет много времени … Что займет много времени, так это вставить столбцы в середине других столбцов … b / c, тогда движок должен создать новую таблицу и скопировать данные в новую таблицу.

Единственное реальное решение для непрерывного времени бесперебойной работы – это избыточность .

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

Например, если вам нужно добавить столбец, вы можете создать копию таблицы, затем добавить столбец в эту копию, а затем использовать sp_rename() чтобы переместить старую таблицу в сторону и новую таблицу на место.

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

Для некоторых видов сложных обновлений вы можете полностью дублировать базу данных на отдельном сервере. Как только это будет готово, просто замените записи DNS для двух серверов и voilà!

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

Msgstr "Добавить столбец, а затем выполнить относительно небольшие пакеты UPDATE, чтобы заполнить столбец значением по умолчанию. Это должно предотвратить любые заметные замедления"

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

Возможно, вы захотите переименовать текущую таблицу с X на Y. Вы можете сделать это с помощью этой команды sp_RENAME '[OldTableName]', '[NewTableName]'.

Повторно создайте новую таблицу как X с новым столбцом, установленным в NOT NULL, а затем вставьте пакет из Y в X и включите значение по умолчанию либо в свою вставку для нового столбца, либо поместите значение по умолчанию в новый столбец при воссоздании таблицы X.

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

Пробовали ли вы просто добавить столбец, заполняющий его данными, и установив столбец NOT NULL?

Поэтому, в конце концов, я не думаю, что есть волшебная пуля.

Я не хотел, чтобы столбец разрешал null, что означало бы, что мне нужно иметь значение по умолчанию.

Добавление столбца NOT NULL с ограничением DEFAULT в таблицу любого количества строк (даже миллиарды) стало намного проще, начиная с SQL Server 2012 (но только для Enterprise Edition), поскольку они позволили ему работать в Интернете (в большинстве случаев ), где для существующих строк значение будет считываться из метаданных и фактически не хранится в строке до тех пор, пока строка не будет обновлена, или кластеризованный индекс не будет восстановлен. Вместо того, чтобы перефразировать больше, вот соответствующий раздел на странице MSDN для ALTER TABLE :

Добавление NOT NULL столбцов в качестве онлайн-операции

Начиная с SQL Server 2012 Enterprise Edition добавление столбца NOT NULL со значением по умолчанию – это онлайн-операция, когда значением по умолчанию является константа времени выполнения . Это означает, что операция выполняется почти мгновенно, независимо от количества строк в таблице. Это связано с тем, что существующие строки в таблице не обновляются во время операции; вместо этого значение по умолчанию сохраняется только в метаданных таблицы, и значение просматривается по мере необходимости в запросах, которые обращаются к этим строкам. Такое поведение происходит автоматически; дополнительный синтаксис не требуется для реализации онлайн-операции за синтаксисом ADD COLUMN. Константа времени выполнения – это выражение, которое производит одно и то же значение во время выполнения для каждой строки таблицы независимо от ее детерминизма. Например, константное выражение «Мои временные данные» или системная функция GETUTCDATETIME () являются константами времени выполнения. Напротив, функции NEWID () или NEWSEQUENTIALID () не являются константами времени выполнения, поскольку для каждой строки таблицы создается уникальное значение. Добавление столбца NOT NULL со значением по умолчанию, который не является константой времени выполнения, всегда выполняется в автономном режиме, а эксклюзивная (SCH-M) блокировка выполняется на время операции.

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

Колонки типа varchar (max), nvarchar (max), varbinary (max), xml, text, ntext, image, hierarchyid, геометрия, география или CLR UDTS не могут быть добавлены в онлайн-операции. Столбец нельзя добавить в сеть, если это приводит к тому, что максимально возможный размер строки превышает предел в 8,060 байт. В этом случае колонка добавляется как автономная операция.

выберите новую таблицу и переименуйте ее. Пример. Добавление столбца i в таблицу A:

select *, 1 as i into A_tmp from A_tbl //Add any indexes here exec sp_rename 'A_tbl', 'A_old' exec sp_rename 'A_tmp', 'A_tbl'

Должно быть быстрым и не трогать журнал транзакций, как вставка в партии. (Я только что сделал это сегодня с таблицей из 70 миллионов строк за <2 мин).

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

Другой метод заключается в том, чтобы добавить столбец в новую связанную таблицу (предположим, что отношение «один к одному» вы можете обеспечить, предоставив FK уникальный индекс). Затем вы можете заполнить это партиями, а затем вы можете добавить соединение в эту таблицу, где бы вы ни хотели, чтобы данные отображались. Примечание. Я бы рассматривал это только для столбца, который я бы не хотел использовать в каждом запросе в исходной таблице, или если ширина записи моей исходной таблицы становилась слишком большой или добавлялась несколько столбцов.

sqlserver.bilee.com

sql - MSSQL - добавить новый столбец в функции иерархической таблицы

У меня три функции таблицы:

Шаг 1:

  1. Функция func1, которая возвращает один выбор:
CREATE FUNCTION [dbo].[func1] () RETURNS TABLE AS RETURN ( SELECT 1 AS col1, 2 AS col2, 3 AS col3 ) GO
  1. Функция func2, которая возвращает все из func1:
CREATE FUNCTION [dbo].[func2] () RETURNS TABLE AS RETURN ( SELECT * FROM func1() ) GO
  1. Функция func3, которая возвращает столбцы из func1, вызванные из func2, вот так:
CREATE FUNCTION [dbo].[func3] () RETURNS TABLE AS RETURN ( SELECT col1, col2, col3 FROM func2() ) GO

Проблема возникает, когда я добавляю новый столбец в func1 с именем col4, и я пытаюсь добавить то же имя столбца в func3.

Шаг 2:

  1. Alter func1, чтобы добавить новый столбец col4:
ALTER FUNCTION [dbo].[func1] () RETURNS TABLE AS RETURN ( SELECT 1 AS col1, 2 AS col2, 3 AS col3, 4 AS col4, --the new column ) GO
  1. Функция func2 остается той же, поскольку "выбирает все столбцы из func1".

  2. Измените func3, чтобы добавить тот же столбец из func1 (col4):

ALTER FUNCTION [dbo].[func3] () RETURNS TABLE AS RETURN ( SELECT col1, col2, col3, col4, -- the new column from func1 FROM func2() ) GO

Когда я запускаю этот последний запрос, я получаю это сообщение об ошибке:

Msg 207, уровень 16, состояние 1, процедура func3, строка 11 Недопустимое имя столбца "col4".

Мой вопрос: у MSSQL есть некоторые ссылки, хранящиеся в кеше? Я пытаюсь перезапустить SQL Server, но это решение не работает.

Единственный способ, который я нашел, - это изменить также func2 без изменений и после запуска изменить func3.

Есть какой-то другой метод, или в чем причина?

qaru.site