Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обойти ошибку при update? / 13 сообщений из 13, страница 1 из 1
20.11.2018, 12:19
    #39735539
fumitox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
Всем привет! Есть определенная форма в которую пользователь загружает эксель, в результате создается временная таблица Temp_table (PriceID, Qty, Price) и нажимает обновить прайс.

Запрос на SQL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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 не выполняет, все зарубает на стадии проверки.

Можно обойти добавив перед запросом:
Код: sql
1.
2.
3.
4.
5.
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 



Но это усложняет код. Усложнять работу пользователю чтобы он пользовался строго определенной формой тоже не вариант.
Есть способ правильно обойти проверку?
...
Рейтинг: 0 / 0
20.11.2018, 12:21
    #39735541
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
fumitox,

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

ваш случай завернуть в динамику update
...
Рейтинг: 0 / 0
20.11.2018, 12:25
    #39735543
fumitox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
TaPaK,
Как динамике увидеть временную таблицу созданную не в динамике?
...
Рейтинг: 0 / 0
20.11.2018, 12:59
    #39735575
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
fumitox,

перезагружайте неполные промежуточные данные в таблицу с полной структурой, например. Затем апдейт с полноценной таблицей.
Немного усложнится загрузчик по количеству вариантов.
...
Рейтинг: 0 / 0
20.11.2018, 13:01
    #39735577
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
fumitoxTaPaK,
Как динамике увидеть временную таблицу созданную не в динамике?
Temp_table это "временная таблица"?

ну и очевидно - создавать в той же динамике
...
Рейтинг: 0 / 0
20.11.2018, 13:01
    #39735578
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
Хотя, наверное, будет та же проблема... Динамическим запросом, согласен.
...
Рейтинг: 0 / 0
20.11.2018, 13:02
    #39735582
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
и да все почитатели универсально плохих скриптов, должны универсально страдать
...
Рейтинг: 0 / 0
20.11.2018, 13:47
    #39735613
fumitox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
Не всегда есть возможность редактировать на всех этапах... В моем случае приходят данные из приложения во временной таблице созданной не в динамике, и я могу только с ней работать. Без страданий никак))
Думал может ключ какой есть, для игнорирования ошибок...
Пока добавлять заранее отсутствующий столбец перед выполнением - лучшее решение. Без дополнительных таблиц и переливания туда сюда данных.
...
Рейтинг: 0 / 0
20.11.2018, 16:04
    #39735723
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
fumitoxНе всегда есть возможность редактировать на всех этапах... В моем случае приходят данные из приложения во временной таблице созданной не в динамике, и я могу только с ней работать. Без страданий никак))
Думал может ключ какой есть, для игнорирования ошибок...
Пока добавлять заранее отсутствующий столбец перед выполнением - лучшее решение. Без дополнительных таблиц и переливания туда сюда данных.Temp_table - это ПОСТОЯННАЯ таблица, а не временная.

P.S. Для определения существования объекта достаточно написать OBJECT_ID(N'ИмяОбъекта') IS NOT NULL
А для колонки я обычно пишу COL_LENGTH(N'ИмяТаблицы',N'ИмяКолонки') IS NOT NULL
Намного короче, чем у вас.
...
Рейтинг: 0 / 0
20.11.2018, 16:20
    #39735738
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
fumitoxВсем привет! Есть определенная форма в которую пользователь загружает эксель, в результате создается временная таблица Temp_table (PriceID, Qty, Price) и нажимает обновить прайс.

Запрос на SQL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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 не выполняет, все зарубает на стадии проверки.

Можно обойти добавив перед запросом:
Код: sql
1.
2.
3.
4.
5.
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 - означает "усложнить код"?
Однако!
...
Рейтинг: 0 / 0
20.11.2018, 18:10
    #39735787
WarAnt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
Код: sql
1.
2.
3.
4.
5.
6.
7.
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,
...
Рейтинг: 0 / 0
20.11.2018, 18:13
    #39735791
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
WarAnt,

Чукча не читатель?
...
Рейтинг: 0 / 0
20.11.2018, 21:01
    #39735834
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обойти ошибку при update?
fumitoxсоздается временная таблица Temp_table (PriceID, Qty, Price)

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

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

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

Но по сути вы пишете: Есть способ правильно обойти ошибку запроса? И ответ тут очевиден. Ошибки не "обходятся", а исправляются.
А вообще надо как минимум проверять данные приходящие от пользователя. А если у вас там в Price или Qty строка записана?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как обойти ошибку при update? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]