Обновление SQL из оператора select - PullRequest
6 голосов
/ 29 июня 2009

Извините за длину, я пытаюсь дать много информации, чтобы избежать несоответствующих решений.

Моя цель - встроить как минимум 1 оператор UPDATE в оператор SELECT, чтобы у меня была возможность обновить некоторые вычисленные значения за мгновение до запуска оператора SELECT (представьте, что это TRIGGER в SELECT). VIEW не является непосредственным решением, так как я ограничен системой, которую я использую (см. Ниже).

Я настраиваю стороннюю коммерческую ERP, которая слаба по функциям (система останется безымянной! - в результате вы не слышали об этом, но она тоже не выросла дома). У этого есть постоянная возможность запроса, где я могу использовать текстовый / GUI, чтобы построить запрос SELECT. После сохранения запроса пользователи могут щелкнуть запрос, чтобы выполнить его и увидеть результаты. ERP работает поверх MS SQL Server 2000; Обновление версии НЕ в картах прямо сейчас. Я могу написать любой набор функций, который мне нужен, за пределами ERP на любом языке, который я хочу, я делал это в прошлом, если функции гарантируют это. Но моему сообществу пользователей легче, когда мои настройки могут быть выполнены в системе ERP.

Запрос может быть сколь угодно сложным, но пакет ERP создает сам оператор SQL Select. Внутренняя часть скомпилированной ERP выглядит примерно так (это только предположение!):

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond

Конструктор GUI помогает начинающим пользователям создавать fieldList и т. Д., Но вы можете обойти его и написать предложения в тексте, если SQL-код допустим при объединении, как описано выше.

Я не могу найти заклинание для запуска хранимой процедуры в качестве побочного эффекта оператора SELECT, будь то в предложении select, предложении where и т. Д. Мне действительно все равно, как сделать джейлбрейк системы - - стабильная атака с использованием SQL-инъекций была бы приемлемой, если только это не означало, что мне пришлось изменять безопасность самого сервера sql. Я посмотрел на UDF, но вы не можете поместить оператор UPDATE в скалярную UDF, и нет смысла пытаться изменить возвращение таблицы UDF (или нет?). Если вы можете ОБНОВИТЬ из VIEW, то я хотел бы увидеть пример, но я понимаю, что могу использовать VIEW для вычисления столбцов, и это не то решение, которое я ищу. В Интернете я читал наводящее на размышления заявление о возможности использовать какой-то XP_ для достижения этой цели, но какой именно XP_ или как это сделать, я не знаю.

этот вопрос сам по себе НЕ является решением: Обновление таблицы в операторе выбора

Ответы [ 5 ]

1 голос
/ 30 июня 2009

Я не могу придумать, каким образом объединить SELECT с ОБНОВЛЕНИЕМ в SQL 2000 (хотя в 2005 году и выше доступно предложение OUTPUT). Тем не менее, похоже, что вы получаете три строковых значения (fieldList, tableListAndJoins, whereCond), которые объединяются вместе с «SELECT», «FROM» и «WHERE», и при условии, что они не выполняют какого-либо серьезного обнаружения кода, подобного введению SQL, возможно, вы сможете собрать что-то вроде этого:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn"

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[Точки с запятой на самом деле являются необязательными и могут даже не работать в SQL 2000 - они просто дают понять, где заканчивается одна команда и начинается следующая.]

Недостатком этого является то, что вы получите два набора данных. Первым будет пустой набор из одного столбца (псевдоним которого равен NULL, если вы хотите указать имя столбца), а данные, которые вы хотите, будут во втором наборе. Возможны и другие обходные пути, в зависимости от того, как используются эти три значения и как выявляются ошибки. (Пусть этот первый запрос сгенерирует ошибку, и надеюсь, что обновление и второй запрос пройдут?)

0 голосов
/ 29 июня 2009

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

Звучит так, будто ты перепробовал почти все, что я бы попробовал. Я чувствую к вам, потому что было бы довольно легко обновить состояние после того, как вы запустили выбор.

0 голосов
/ 29 июня 2009

Я не уверен, что понимаю ограничения вашей ситуации, но вы не можете просто выполнить два оператора одновременно, например:

string sql = "update MyTable set x=y;select x from MyTable;";
0 голосов
/ 29 июня 2009

Будет ли сохраненная функция опцией? Вы можете вызывать их более легко (по крайней мере, в MySQL), чем хранимые процедуры - вместо «вызова PROCEDURE_NAME (x)» вы можете просто использовать «SELECT FUNCTION_NAME (x)».

0 голосов
/ 29 июня 2009

Попробуйте использовать динамический sql в хранимой процедуре, как указано в последнем ответе здесь

Связано так, чтобы оригинальный автор мог получить кредиты, которые он / она заслуживает, и, надеюсь, будет полезен для вас.

И так как вы хотите SELECT до ОБНОВЛЕНИЯ, вы можете изменить динамический sql, как в ссылке, которую я разместил, чтобы сначала выполнить SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...