سؤال

وآسف لطول هذا، وأنا أحاول أن تعطي الكثير من المعلومات لتجنب الحلول غير الحكومية ذات الصلة.

وهدفي هو تضمين لا يقل عن 1 عبارة UPDATE في عبارة SELECT بحيث لدي فرصة لتحديث بعض القيم المحسوبة في لحظة قبل تشغيل العبارة المختارة (التفكير في الأمر وكأنه TRIGGER على SELECT). VIEW ليس في حل فوري، لأن أنا مقيدة من قبل النظام الذي أستخدمه (انظر أدناه).

وانا تخصيص لتخطيط موارد المؤسسات تجاري 3rd الطرف الذي هو ضعيف على الميزات (والنظام يبقى مجهول - هو أنت لم تكن قد سمعت النتيجة من ذلك، ولكن ليست نابعة من الداخل أيضا). لديها منشأة الاستعلام المعلبة أين يمكنني استخدام النص / GUI لبناء استعلام SELECT. مرة واحدة حفظ الاستعلام، يمكن للمستخدمين النقر على الاستعلام لتنفيذه ونرى النتائج. يدير ERP فوق MS SQL خادم 2000؛ إصدار الترقية ليست في بطاقات الآن. أستطيع أن أكتب كل ما مجموعة ميزة أحتاج خارج ERP في أي لغة أريد، وقد فعلت ذلك في الماضي، إذا كان الميزات تبرر ذلك. ولكن المجتمع المستعمل بلدي يجد من الأسهل عندما التخصيصات بلدي يمكن القيام به في نظام ERP.

والاستعلام يمكن أن تكون معقدة بصورة تعسفية، ولكن يبني حزمة ERP بيان SQL اختر نفسها. الداخلية إلى ERP جمعت شيء من هذا القبيل (وهذا هو مجرد تخمين!):

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

وباني واجهة المستخدم الرسومية يساعد المستخدمين المبتدئين بناء fieldList وهلم جرا ولكن يمكنك تجاوز ذلك وكتابة الشروط في النص ما دام SQL غير صالح عند مجتمعة على النحو الوارد أعلاه.

وأنا لا يمكن أن يبدو للعثور على التعويذة لتشغيل الإجراء المخزن كأثر جانبي للعبارة SELECT، سواء كان ذلك في جملة SELECT، حيث شرط، وما أنا حقا لا يهمني كيف الهروب من السجن النظام - - سيكون مستقر هجوم حقن SQL يكون على ما يرام، طالما أنه لا يعني اضطررت لتعديل أمن مزود خدمة الأساسي نفسه. لقد ألقيت نظرة على UDFS، ولكن لا يمكنك وضع عبارة UPDATE إلى UDF العددية، وأنه لا معنى لمحاولة تعديل بعودة UDF الجدول (أو أليس كذلك؟). إذا كان يمكنك التحديث من خلال VIEW ثم أود أن نرى على سبيل المثال، لكنني أدرك أنني يمكن استخدام VIEW لحساب الأعمدة وليس هذا هو الحل أنا أبحث عن. قرأت بيان موحية على الانترنت عن أن تكون قادرة على استخدام نوع من XP_ لتحقيق ذلك، ولكن على النحو الذي XP_ أو كيفية القيام بذلك، وأنا لا أعرف.

وهذه مسألة ليست حلا في حد ذاته: تحديث طاولة في بيان حدد

هل كانت مفيدة؟

المحلول

لا أستطيع التفكير في أي طريقة الجمع بين SELECT مع UPDATE في SQL 2000 (على الرغم من عام 2005 وحتى، شرط OUTPUT متاح). ومع ذلك، يبدو أن تحصل على ثلاثة قيم السلسلة (fieldList، tableListAndJoins، whereCond) التي تحصل متصلا مع "SELECT"، "FROM" و "أين"، وعلى افتراض أنها لا تفعل بعض خطير مثل injenction SQL كشف الرمز، كنت قد تكون قادرة على حل مشكلة معا شيئا من هذا القبيل:

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

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[والفاصلة المنقوطة هي في الواقع اختياري، وربما حتى لا تعمل في SQL 2000 - لكنه يستفيد من الواضح فيها أحد طرفي القيادة وتبدأ في اليوم التالي]

والجانب السلبي من هذا هو أن عليك أن نعود مجموعتين من البيانات. وسيكون أول فارغة مجموعة عمود واحد (الاسم المستعار الذي NULL إذا كنت تريد اسما لالعمود)، والبيانات التي تريدها سيكون في المجموعة الثانية. قد يكون العمل في أنحاء أخرى من الممكن، اعتمادا على كيفية استخدام هذه القيم الثلاث وكيف يتم القبض أخطاء. (ولهذا الاستعلام الأول تولد والخطأ، ونأمل التحديث والاستعلام الثاني من خلال الذهاب؟)

نصائح أخرى

وحاول استخدام مزود دينامية في الإجراء المخزن كما جاء في الرد الماضي هنا

ويرتبط بذلك أن المؤلف الأصلي يمكن الحصول على ائتمانات أنه / أنها تستحق، ونأمل أن تكون مفيدة لك.

ومنذ كنت تريد SELECT قبل التحديث، يمكنك تعديل مزود الديناميكي كما في الارتباط نشرت لي، للقيام SELECT أولا.

وأنا لست متأكدا من أنني أفهم قيود الوضع الخاص بك، ولكن لا يمكنك فقط تشغيل بيانين في وقت واحد، مثل:

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

هل تكون وظيفة تخزين خيار؟ يمكنك استدعاء هؤلاء أكثر بسهولة (في الخلية على الأقل) من الإجراءات المخزنة - بدلا من "الدعوة PROCEDURE_NAME (خ)" يمكنك استخدام فقط "SELECT FUNCTION_NAME (خ)"

وتخميني مع XP هو أن كنت أكتب XP الخاص بك للقيام التحديث وإدراجه في الاستعلام بطريقة أو بأخرى. أم لا التي من شأنها العمل، وحيث في الاستعلام يجب أن يذهب ذلك ليتم تشغيلها قبل SQL ينظر إلى البيانات الخاصة بك تماما خارج عن ارادتي.

وهذا يبدو وكأنه كنت قد حاولت كل شيء تقريبا وأود أن محاولة. أشعر لك لأنه ربما سيكون من السهل بدلا لتحديث الدولة <م> بعد قمت بتشغيل حدد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top