2010-10-25 5 views
1

Ниже приведен фрагмент SQL-запроса, который я использую для обновления таблицы до нужных типов данных.ALTER TABLE Выполнение независимо от результатов оценки состояния

If NOT Exists(Select * From Information_Schema.Columns 
    Where Table_Name = N'RXINFO' 
    And Table_Schema = N'scriptassist' 
    And Column_Name = N'LastChanged'  
    And DATA_Type = N'TIMESTAMP' 
    AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0) 
    BEGIN 
     Print 'LastChanged Field needed type updating' 
     Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP 
    END 

В настоящее время проблема заключается в следующем:

Если я запускаю заявление с Alter Table присутствует SQL Server выдает эту ошибку у меня.

Msg 4927, Level 16, State 1, Line 12 Невозможно изменить столбец 'последнего изменения', чтобы быть типом данных метки времени.

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

Если я его вынимаю, ничего не происходит, заявление печати даже не срабатывает.

Единственное, о чем я могу думать до сих пор, заключается в том, что каким-то образом MS SQL предварительно оценивает SQL и определяет, могут ли все пути кода выполняться, и поскольку они не могут это порождать ошибку. Однако это не имеет большого смысла.

+0

У меня нет ошибки при запуске того же кода на SQL Server 2008 R2. Вы сказали, что * должны * оценивать значение false. Вы выбрали критерии выбора, чтобы убедиться, что он возвращает результат? –

+0

@mootinator, да, я сделал. – msarchet

ответ

4

SQL Server анализирует ваш SQL, прежде чем он его выполнит. Ошибка возникает при разборе.

Чтобы отложить синтаксический, пока линия не будет реально работать, использовать Exec:

exec ('Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP') 
+0

безупречный спасибо. – msarchet

+0

Я только что проверил это, и вы все равно получите ту же ошибку. См. [Мой ответ] (http://stackoverflow.com/questions/4017731/alter-table-executing-regardless-of-condition-evaluational-results/4017902#4017902). –

+0

@ Джо Стефанелли делает хороший момент. Решение Exec() предотвращает оценку кода ALTER COLUMN, когда он не должен запускаться. BOL говорит, что столбец ALTER «type_name не может быть отметкой времени» - http://msdn.microsoft.com/en-us/library/ms190273.aspx – KenJ

2

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

If NOT Exists(Select * From Information_Schema.Columns 
    Where Table_Name = N'RXINFO' 
    And Table_Schema = N'scriptassist' 
    And Column_Name = N'LastChanged'  
    And DATA_Type = N'TIMESTAMP' 
    AND IsNull(CHARACTER_MAXIMUM_LENGTH, 0) = 0) 
    BEGIN 
     Print 'LastChanged Field needed type updating' 
     Alter Table [scriptassist].[RXINFO] Drop Column LastChanged 
     Alter Table [scriptassist].[RXINFO] Add LastChanged TimeStamp 
    END 
+0

+1 Мой ответ защищает от несуществующих столбцов, но это не имеет смысла перечитывая вопрос. – Andomar