Простой ответ на это заключается в следующем:
ALTER TABLE MEN DROP COLUMN Lname;
Можно указать более одного столбца, например:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
В SQL Server 2016 также возможно только опустите столбец, если он существует. Это мешает вам получить ошибку за то, что вас, вероятно, не волнует.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Есть некоторые предпосылки для удаления столбцов. Удаляемые столбцы не могут быть:
Если что-либо из вышеперечисленного является верным, вам нужно сначала удалить эти ассоциации.
Кроме того, следует отметить, что удаление столбца не освобождает пространство от жесткого диска до тех пор, пока кластерный индекс таблицы не будет перестроен. Поэтому часто рекомендуется следовать приведенному выше описанию с помощью команды перестроения таблицы, подобной этой:
ALTER TABLE MEN REBUILD;
Наконец, как некоторые говорили, это может быть медленным и, вероятно, заблокирует таблицу на время. Можно создать новую таблицу с желаемой структурой, а затем переименовать так:
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
Но имейте в виду, что здесь есть окно для потери данных вставленных строк между первым выбором и последней командой переименования .
Первые 3 константы взаимосвязаны. BITSPERWORD - 32. Это нужно установить в зависимости от вашего компилятора и архитектуры. SHIFT равен 5, потому что 2 ^ 5 = 32. Наконец, MASK - это 0x1F, что равно 11111 в двоичном формате (то есть: все нижние 5 бит установлены). Эквивалентно MASK = BITSPERWORD - 1.
Битовый набор концептуально представляет собой просто массив бит. Эта реализация фактически использует массив int и предполагает 32 бита на int. Поэтому всякий раз, когда мы хотим установить, очистить или протестировать (прочитать) бит, нам нужно выяснить две вещи:
Поскольку мы предполагаем, что на int 32 бита, мы можем просто разделить на 32 (и усечь), чтобы получить нужный нам индекс массива. Деление на 32 (BITSPERWORD) аналогично сдвигу вправо на 5 (SHIFT). Вот что такое бит a [i >> SHIFT]. Вы также можете записать это как [i / BITSPERWORD] (и на самом деле вы, вероятно, получите такой же или очень похожий код, если у вашего компилятора есть разумный оптимизатор).
Теперь, когда мы знаем, какой элемент мы хотим , нам нужно выяснить, какой бит. На самом деле мы хотим остаток. Мы могли бы сделать это с помощью i% BITSPERWORD, но оказывается, что i & MASK эквивалентны. Это потому, что BITSPERWORD - это степень 2 (в данном случае 2 ^ 5), а MASK - это все 5 нижних битов.
The bit magic is used as a special addressing scheme that works well with row sizes that are powers of two.
If you try understand this (note: I rather use bits-per-row than bits-per-word, since we're talking about a bit-matrix here):
// supposing an int of 1 bit would exist...
int1 bits[BITSPERROW * N]; // an array of N x BITSPERROW elements
// set bit at x,y:
int linear_address = y*BITSPERWORD + x;
bits + linear_address = 1; // or 0
// 0 1 2 3 4 5 6 7 8 9 10 11 ... 31
// . . . . . . . . . . . . .
// . . . . X . . . . . . . . -> x = 4, y = 1 => i = (1*32 + 4)
The statement linear_address = y*BITSPERWORD + x
also means that x = linear_address % BITSPERWORD
and y = linear_address / BITSPERWORD
.
When you optimize this in memory by using 1 word of 32 bits per row, you get the fact that a bit at column x can be set using
int bitrow = 0;
bitrow |= 1 << (x);
Now when we iterate over the bits, we have the linear address, but need to find the corresponding word.
int column = linear_address % BITSPERROW;
int bit_mask = 1 << column; // meaning for the xth column,
// you take 1 and shift that bit x times
int row = linear_address / BITSPERROW;
So to set the i'th bit, you can do this:
bits[ i%BITSPERROW ] |= 1 << (linear_address / BITSPERROW );
An extra gotcha is, that the modulo operator can be replaced by a logical AND, and the / operator can be replaced by a shift, too, if the second operand is a power of two.
a % BITSPERROW == a & ( BITSPERROW - 1 ) == a & MASK
a / BITSPERROW == a >> ( log2(BITSPERROW) ) == a & SHIFT
This ultimately boils down to the very dense, yet hard-to-understand-for-the-bitfucker-agnostic notation
a[ i >> SHIFT ] |= ( 1 << (i&MASK) );
But I don't see the algorithm working for e.g. 40 bits per word.
Я решил использовать Csv Reader Себастьяна Лориона.
Предложение Джея Риггса также является отличным решением, но мне просто не нужны были все функции, которые предоставляет Общий синтаксический анализатор Эндрю Риссинга .
После использования Csv Reader Себастьяна Лориона в мой проект в течение почти полутора лет, я обнаружил, что он вызывает исключения при синтаксическом анализе некоторых файлов CSV, которые я считаю правильно сформированными.
Начиная с set ():
Сдвиг вправо на 5 аналогичен делению на 32. Он позволяет определить, в каком int находится бит.
МАСКА равна 0x1f или 31. Операция И с адресом дает битовый индекс в int. Это то же самое, что и остаток от деления адреса на 32.
Сдвиг 1 влево на битовый индекс ("1 << (i & MASK)") приводит к целому числу, которое имеет только 1 бит в заданном наборе позиции.
Операция ИЛИ устанавливает бит.
Строка «int sh = i >> SHIFT;» является потраченной впустую строкой, потому что они не использовали sh снова под ней, а вместо этого просто повторяли «i >> SHIFT»
clr () в основном то же самое, что и set, за исключением того, что вместо OR с 1 << (i & MASK), чтобы установить бит, он выполняет операцию И с инверсией, чтобы очистить бит. test () И с 1 << (i & MASK) для проверки бита.
Битовая сортировка также удалит дубликаты из списка, потому что она будет считать до 1 на целое число. Сортировка, которая использует целые числа вместо битов для подсчета более одного каждого из них, называется поразрядной сортировкой.
Несколько сомнений: 1. Зачем нужна 32 бита? 2. Можем ли мы сделать это на Java, создав HashMap с ключами от 0000000 до 9999999 и значения 0 или 1 в зависимости от наличия / отсутствия бита? Каковы последствия для такой программы?