Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

Я не могу придумать какой-либо способ объединить SELECT с UPDATE в 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, если вы хотите дать столбцу имя), а нужные вам данные будут находиться во втором наборе.Возможны и другие обходные пути, в зависимости от того, как используются эти три значения и как обнаруживаются ошибки.(Пусть этот первый запрос сгенерирует ошибку и надеется, что обновление и второй запрос пройдут?)

Другие советы

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

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

А поскольку вам нужен SELECT перед UPDATE, вы можете изменить динамический sql, как в опубликованной мной ссылке, чтобы сначала выполнить SELECT.

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

string sql = "update MyTable set x=y;select x from MyTable;";

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top