2009-06-29 10 views
6

Прошу прощения за это, я пытаюсь дать много информации, чтобы избежать ненужных решений.SQL update from select statement

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

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

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

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

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

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

этот вопрос не является решением проблемы, и сам по себе: Updating a table within a select statement

+0

Дополнительные исследования FYI показывают, что функция CLR может получить меня там, но функции CLR недоступны в SQL 2000. – user130582

ответ

1

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

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

tableListAndJoins = "MyTable" 

whereCond = "SomeColumn = 'Criteria'" 

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

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

+0

благодарим вас за прочитав то, что я написал полностью – user130582

0

Попробуйте использовать динамический SQL в хранимой процедуре, как stated on the last reply here

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

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

0

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

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

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

0

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

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