كيفية حل مشكلات تعيين معلمات استعلام SQL أثناء استخدام موفر Oracle OLE DB؟

StackOverflow https://stackoverflow.com/questions/58540

  •  09-06-2019
  •  | 
  •  

سؤال

عند محاولة إدخال استعلام SQL مع المعلمات باستخدام موفر Oracle OLE DB، أحصل على الخطأ التالي:

لا يمكن استخراج المعلمات من أمر SQL.قد لا يساعد الموفر في تحليل معلومات المعلمة من الأمر.في هذه الحالة، استخدم وضع الوصول "أمر SQL من متغير"، حيث يتم تخزين أمر SQL بأكمله في متغير.
معلومات إضافية:
لا يمكن للموفر اشتقاق معلومات المعلمة ولم يتم استدعاء SetParameterInfo.(موفر Microsoft OLE DB لـ Oracle)

لقد حاولت اتباع الاقتراح هنا ولكني لا أفهم تمامًا ما هو المطلوب:استعلامات ذات معلمات ضد Oracle

أيه أفكار؟

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

المحلول

للتوسع في الرابط الوارد في السؤال:

  1. إنشاء متغير الحزمة
  2. انقر مرتين على اسم متغير الحزمة.(وهذا يسمح لك بالوصول إلى خصائص المتغير)
  3. قم بتعيين الخاصية "EvaluateAsExpression" إلى "صحيح".
  4. أدخل الاستعلام في منشئ التعبير.
  5. قم بتعيين الاستعلام المصدر OLE DB إلى أمر SQL من المتغير

يمكن لمنشئ التعبير إنشاء تعبيرات ديناميكيًا باستخدام متغير لإنشاء "استعلامات ذات معلمات".
إذن الاستعلام "العادي" التالي:

select * from book where book.BOOK_ID = ?

يمكن كتابتها في منشئ التعبير على النحو التالي:

"select * from book where book.BOOK_ID = " + @[User::BookID]

يمكنك بعد ذلك إجراء معالجة فارغة وتحويل البيانات باستخدام منشئ التعبير.

نصائح أخرى

إذا كنت تستخدم مهمة تدفق البيانات وتستخدم مصدر OLE DB، وتحتاج إلى تحديد معلمات الاستعلام الخاص بك:

  1. إنشاء متغير لحفظ عبارة الاستعلام "كاملة":انقر بزر الماوس الأيمن على المساحة الفارغة خارج الحزمة - ثم انقر فوق المتغيرات:

Variables

انقر فوق إضافة متغيرات في نافذة المتغيرات:

enter image description here

جعل الاسم هو SQL_DTFLOW_FULL أو شيء يمكنك فهمه بسهولة.ال variable data type يكون STRING

  1. قم بإنشاء متغير (متغيرات) لحفظ المعلمة (المعلمات) الخاصة بك.

أي أن كامل عبارات الاستعلام هي:

SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter

في العينة أعلاه، لدي معلمة واحدة فقط:@BookID، لذا أحتاج إلى إنشاء متغير واحد لحفظ المعلمة الخاصة بي.إضافة المزيد من المتغيرات يعتمد على استفساراتك.

ParamAdd

اعطها اسما SQL_DTFLOW_BOOKID

ال variable data type يكون STRING

لذلك، تحتاج إلى جعل SSIS الخاص بك أنيقًا، ويتم فرز المتغيرات إلى أجزاء مفهومة.

حاول أن تجعل اسم المتغير هو SQL_{TASK NAME}_{VariableName}

  1. جعل التعبير عن SQL_DTFLOW_FULL المتغير، انقر على الرقم 1، وابدأ في تعبئة الرقم 2.اجعل عبارات SQL الخاصة بك عبارة عن عبارة SQL صحيحة باستخدام كتلة السلسلة.عادةً ما تستخدم كتلة السلسلة "اقتباس مزدوج" في البداية والنهاية.قم بربط المتغيرات مع كتلة السلسلة.

Expression

انقر فوق تقييم التعبير، لإظهار النتيجة، وللتأكد من صحة استعلامك، انسخ والصق نتيجة الاستعلام في SSMS.

تأكد بنفسك من خلو المتغيرات من حقن SQL باستخدام المنطق الخاص بك.(استخدم غريزة المطور الخاصة بك)

  1. افتح مهمة تدفق البيانات، وافتح محرر مصدر OLE DB بالنقر المزدوج فوق العنصر.

Data Flow

  • حدد وضع الوصول إلى البيانات: SQL Command From Variable
  • حدد اسم المتغير: SQL_DTFLOW_FULL
  • انقر فوق معاينة للتأكد من أنه يعمل.

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

لتغيير قيمة المتغير، قم بتعيينها قبل مهمة تدفق البيانات، نتيجة SQL SQL_DTFLOW_FULL سيتم تغيير المتغير في كل مرة تقوم فيها بتغيير قيمة المتغير الخاص بك.

في حالتي كانت المشكلة هي أنه كان لدي تعليقات داخل SQL بالشكل العادي لـ /* */ وكان لدي أيضًا أسماء مستعارة للأعمدة كـ "اسم العمود" بدلاً من [اسم العمود].

بمجرد إزالتها، يعمل.

حاول أيضًا الحصول على المعلمة الخاصة بك؟عبارة ضمن جملة WHERE وليس ضمن JOINS، كان ذلك جزءًا من المشكلة أيضًا.

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