Обновить столбец таблицы в SQL Server 2005

#sql #sql-server-2005

#sql #sql-server-2005

Вопрос:

Я проверяю наличие столбца в таблице. Если он существует, я обновляю столбец во 2-й таблице на основе столбца в первой таблице.

Проблема в том, что обновление выполняется, когда оно не должно выполняться, и приводит к ошибке.

Я проверяю наличие столбца Requested_by в таблице Service_requests_details , затем обновляю столбец на service_requests основе столбца requested_by в таблице Service_Requests_Details .

Дело в том, Requested_By что он может не существовать в таблице Service_requests_details .

 IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'Requested_By' and object_ID = object_ID(N'Service_Requests_Details'))
BEGIN
      Update SR
      Set SR.Requested_By  = SRD.Requested_By 
      FROM Service_Requests SR
      INNER JOIN Service_Requests_Details SRD ON SRD.Request_Index = SR.Service_Request_Index
END
GO
  

Обновить:
Спасибо всем, кто ответил. Спасибо @SqlAcid за ответ.

Комментарии:

1. Что это возвращает? ВЫБЕРИТЕ * ИЗ sys.columns, ГДЕ Name = N’Requested_by’ и object_ID = object_ID(N’Service_requests_details’. Помните, что параметры процедур также хранятся в sys.columns, у вас может быть процедура с тем же именем…

2. Попробуйте добавить дополнительный ‘U’ к вашему object_id() (второй параметр — это тип объекта, добавление ‘U’ для таблиц)

3. Как предложил Дилан, я попробовал то же самое с Information_Schema.columns и столкнулся с той же проблемой

4. В общем, это очень плохая идея; столбцы в таблицах следует рассматривать как фиксированные атрибуты объекта, который они представляют. При этом, в чем именно заключается ошибка, которую вы получаете? Я предполагаю, что ваш скрипт не пройдет проверку оптимизатора, потому что вы пытаетесь выполнить обновление из столбца, который не существует

5. @StuartAinsworth: обновление выполняется 1 раз, и после этого необходимо удалить этот столбец из другой таблицы. Поэтому мы просто хотим убедиться, что скрипт успешно выполняется при многократном запуске.

Ответ №1:

Проблема в том, что анализатор по-прежнему будет оценивать вашу инструкцию update и завершится ошибкой, даже если значение IF EXISTS равно false; вы можете использовать sp_executesql, чтобы обойти это:

 declare @sql nvarchar(1000)
IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'Requested_By' and object_ID = object_ID(N'Service_Requests_Details')) 
BEGIN 
  set @sql = 'Update SR 
      Set SR.Requested_By  = SRD.Requested_By  
      FROM Service_Requests SR 
      INNER JOIN Service_Requests_Details SRD ON SRD.Request_Index = SR.Service_Request_Index'
  exec sp_executesql @sql
END 
GO 
  

Ответ №2:

Это то, что я бы сделал в SQL 2008, у меня нет экземпляра SQL 2005, чтобы посмотреть, работает ли он там, но стоит попробовать:

 IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Service_Requests_Details' AND COLUMN_NAME = 'Requested_By')
BEGIN
    ...
END
  

Комментарии:

1. Это должно работать в SQL 2005… Проверьте ссылку: msdn.microsoft.com/en-us/library/ms188348 (v=SQL.90).aspx