ALTER TABLE Выполнение независимо от результатов оценки состояния - PullRequest
1 голос
/ 25 октября 2010

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

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

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

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

Сообщение 4927, уровень 16, состояние 1, строка 12 Невозможно изменить столбец «LastChanged» как метку времени типа данных.

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

Если я достану его, ничего не произойдет, оператор печати даже не сработает.

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

Ответы [ 2 ]

4 голосов
/ 25 октября 2010

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

Чтобы отложить разбор до фактического запуска строки, используйте exec:

exec ('Alter Table [scriptassist].[RXINFO] Alter Column LastChanged TIMESTAMP')
2 голосов
/ 25 октября 2010

Я считаю, что вы получаете эту ошибку, потому что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...