2009-06-30 4 views
3

Я понимаю, что при добавлении столбца в таблицу, содержащую данные на SQL-сервере, столбец должен иметь параметр NULL или значение по умолчанию. В противном случае SQL Server мог бы использовать новые строки?Невозможно добавить столбец «NOT NULL» в пустую таблицу в SQL Server

Я в недоумении относительно того, почему я не могу добавить столбец NOT NULL в пустую таблицу. Я пробовал это в двух экземплярах SQL 2008 и одном экземпляре SQL 2005 без проблем. Однако у клиента с SQL 2000 есть эта проблема. Это связано с SQL 2000 или это вариант, который вы можете отключить. Будем надеяться, что это вариант.

Select @@Version 

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) 17 декабря 2002 14:22:05 Copyright (с) 1988-2003 Microsoft Corporation Developer Edition на Windows, NT 5.1 (Build 2600: Service Pack 3)

Select count(*) from actinv 

0 

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL 

Msg 4901, Level 16, State 1, Line 1 ALTER TABLE позволяет только столбцы, которые будут добавлены, которые могут содержать неопределенные значения или иметь уточненное определение DEFAULT. Столбец «BATCHNUMBER» не может быть добавлен в таблицу «ActInv», потому что он не разрешает NULL и не определяет определение DEFAULT .

+1

Я знаю, это звучит глупо, но это таблица действительно пуста ? –

+0

Ну, я делаю выбор (*) из ActInv и он возвращает ноль! – user69374

+1

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

ответ

10

SQL Server 2000 не проверяет пустую таблицу , То, что вы видите, - это улучшение в SQL Server 2005/2008.

либо из следующих двух ступенчатых процессов будет внести изменения в SQL Server 2000 против пустой таблицы:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NOT NULL CONSTRAINT ActInv_Temp DEFAULT 'foo' 
ALTER TABLE [ActInv] DROP CONSTRAINT ActInv_Temp 

пойти

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) NULL 
ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL 
+0

Это проясняет, спасибо! – user69374

+1

Это сработало отлично - кроме АЛЬТЕРИРОВАНИЯ таблицы, чтобы добавить столбец с нулевым значением, а ALTERing из таблицы - NOT NULL, мне пришлось ОБНОВИТЬ

SET newcol = . SQL не позволит столбцу с нулевым значением со всеми нулевыми значениями преобразовываться в столбец NOT NULL. Очевидно, действительно :-) – markau

+0

@markau. Этот ответ специфичен для проблемы OP, где OP имеет ** пустую ** таблицу на SQL Server 2000. С пустой таблицей обновление является no-op и не требуется. SQL Server 2005 и более поздние версии будут проверять таблицу, если добавить столбец не null, и продолжить, если таблица пуста. –

0

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

Вам нужно добавить значение по умолчанию в Ненулевое поле, как это:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) DEFAULT 'foo' NOT NULL 

Edit: Я только что видел именно то, что вы делаете на отдельных установках SQL Server (2000 и 2005) , Если таблица действительно пуста, возможно, лучшим решением является удаление/создание таблицы. Это звучит как ошибка в SQL Server 2000.

+0

huh? он уже заявил, что таблица пуста - мне кажется, что вопрос: почему у вас есть NOT NULL без определения по умолчанию при создании таблицы, но вы не можете добавить NOT NULL в пустую таблицу. –

+0

Вопрос в том, почему SQL2000 нужен DEFAULT, если в таблице нет строк? SQL2005 и SQL2008 нет! – user69374

0

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

+0

Этот SQL генерируется программой обновления. Я надеялся, что это вариант, который вы могли бы отключить. Теперь похоже, что мне придется модифицировать программу, чтобы она работала так, как вы предлагаете, что отстой. – user69374

0

Вы рассмотрели следующие 2 в последовательности:

ALTER TABLE [ActInv] ADD [BATCHNUMBER] NVARCHAR(50) 
GO 

ALTER TABLE [ActInv] ALTER COLUMN [BATCHNUMBER] NVARCHAR(50) NOT NULL 
GO 

Я думаю, что должен работать на 2000, а также (у меня есть только 2005 здесь)

 Смежные вопросы

  • Нет связанных вопросов^_^