Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как обойти ошибку при update?  [new]
fumitox
Member

Откуда:
Сообщений: 36
Всем привет! Есть определенная форма в которую пользователь загружает эксель, в результате создается временная таблица Temp_table (PriceID, Qty, Price) и нажимает обновить прайс.

Запрос на SQL:
if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price') 
update p set price = t.price  from price p
join Temp_table t on p.PriceID = t.PriceID

if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Qty') 
update p set Qty= t.Qty  from price p
join Temp_table t on p.PriceID = t.PriceID


Тут все пройдет нормально, но если пользователь создаст временную таблицу Temp_table (PriceID,Price) или Temp_table (PriceID,Qty) то это приводит к ошибке:
Недопустимое имя столбца "Price".
или
Недопустимое имя столбца "Qty".
Сам запрос SQL не выполняет, все зарубает на стадии проверки.

Можно обойти добавив перед запросом:
if not exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price')  
begin 
  ALTER TABLE Temp_table  
  ADD Price money 
end 


Но это усложняет код. Усложнять работу пользователю чтобы он пользовался строго определенной формой тоже не вариант.
Есть способ правильно обойти проверку?
20 ноя 18, 12:19    [21738927]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
fumitox,

правильно - не обновлять все подряд объекты "универсальными скриптами"

ваш случай завернуть в динамику update
20 ноя 18, 12:21    [21738929]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
fumitox
Member

Откуда:
Сообщений: 36
TaPaK,
Как динамике увидеть временную таблицу созданную не в динамике?
20 ноя 18, 12:25    [21738934]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
fumitox,

перезагружайте неполные промежуточные данные в таблицу с полной структурой, например. Затем апдейт с полноценной таблицей.
Немного усложнится загрузчик по количеству вариантов.
20 ноя 18, 12:59    [21739005]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
fumitox
TaPaK,
Как динамике увидеть временную таблицу созданную не в динамике?

Temp_table это "временная таблица"?

ну и очевидно - создавать в той же динамике
20 ноя 18, 13:01    [21739008]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
Хотя, наверное, будет та же проблема... Динамическим запросом, согласен.
20 ноя 18, 13:01    [21739009]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
и да все почитатели универсально плохих скриптов, должны универсально страдать
20 ноя 18, 13:02    [21739013]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
fumitox
Member

Откуда:
Сообщений: 36
Не всегда есть возможность редактировать на всех этапах... В моем случае приходят данные из приложения во временной таблице созданной не в динамике, и я могу только с ней работать. Без страданий никак))
Думал может ключ какой есть, для игнорирования ошибок...
Пока добавлять заранее отсутствующий столбец перед выполнением - лучшее решение. Без дополнительных таблиц и переливания туда сюда данных.
20 ноя 18, 13:47    [21739075]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
fumitox
Не всегда есть возможность редактировать на всех этапах... В моем случае приходят данные из приложения во временной таблице созданной не в динамике, и я могу только с ней работать. Без страданий никак))
Думал может ключ какой есть, для игнорирования ошибок...
Пока добавлять заранее отсутствующий столбец перед выполнением - лучшее решение. Без дополнительных таблиц и переливания туда сюда данных.
Temp_table - это ПОСТОЯННАЯ таблица, а не временная.

P.S. Для определения существования объекта достаточно написать OBJECT_ID(N'ИмяОбъекта') IS NOT NULL
А для колонки я обычно пишу COL_LENGTH(N'ИмяТаблицы',N'ИмяКолонки') IS NOT NULL
Намного короче, чем у вас.
20 ноя 18, 16:04    [21739310]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
fumitox
Всем привет! Есть определенная форма в которую пользователь загружает эксель, в результате создается временная таблица Temp_table (PriceID, Qty, Price) и нажимает обновить прайс.

Запрос на SQL:
if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price') 
update p set price = t.price  from price p
join Temp_table t on p.PriceID = t.PriceID

if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Qty') 
update p set Qty= t.Qty  from price p
join Temp_table t on p.PriceID = t.PriceID



Тут все пройдет нормально, но если пользователь создаст временную таблицу Temp_table (PriceID,Price) или Temp_table (PriceID,Qty) то это приводит к ошибке:
Недопустимое имя столбца "Price".
или
Недопустимое имя столбца "Qty".
Сам запрос SQL не выполняет, все зарубает на стадии проверки.

Можно обойти добавив перед запросом:
if not exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price')  
begin 
  ALTER TABLE Temp_table  
  ADD Price money 
end 



Но это усложняет код. Усложнять работу пользователю чтобы он пользовался строго определенной формой тоже не вариант.
Есть способ правильно обойти проверку?
То есть, вы не понимаете, почему сервер не желает апдейтить Price из таблицы Temp_table, в которой поля Price попросту нет?
А добавить туда поле Price - означает "усложнить код"?
Однако!
20 ноя 18, 16:20    [21739340]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price') 
exec ('update p set price = t.price  from price p
join Temp_table t on p.PriceID = t.PriceID')

if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Qty') 
exec ('update p set Qty= t.Qty  from price p
join Temp_table t on p.PriceID = t.PriceID')
fumitox,
20 ноя 18, 18:10    [21739425]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
WarAnt,

Чукча не читатель?
20 ноя 18, 18:13    [21739429]     Ответить | Цитировать Сообщить модератору
 Re: Как обойти ошибку при update?  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
fumitox
создается временная таблица Temp_table (PriceID, Qty, Price)

но если пользователь создаст временную таблицу Temp_table (PriceID,Price) или Temp_table (PriceID,Qty) то это приводит к ошибке

Есть способ правильно обойти проверку?


Не понял. Это нормально, что подразумевается, что должно обновиться два столбца, а пользователь отправляет только один?
Если нормально, то поставьте пользователю в "форму" галку, и пусть он выбирает, что он конкретно отправляет.

Но по сути вы пишете: Есть способ правильно обойти ошибку запроса? И ответ тут очевиден. Ошибки не "обходятся", а исправляются.
А вообще надо как минимум проверять данные приходящие от пользователя. А если у вас там в Price или Qty строка записана?
20 ноя 18, 21:01    [21739518]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить