سؤال

في تطبيق أعمل على ترقية إلى شبكة الإنترنت، ونحن حاليا الوصول حيوي جداول مختلفة في وقت التشغيل من التشغيل لتشغيل، استنادا إلى سلسلة "القالب" الذي تم تحديده. وأود أن نقل عبء القيام بذلك مرة أخرى إلى قاعدة البيانات الآن أننا نسير إلى خادم SQL، لذلك لم يكن لديك لفوضى مع GridView الحيوية. فكرت في كتابة UDF قيمتها الجدول مع معلمة لاسم الجدول واحد للاستعلام جملة WHERE.

ودخلت التالية لبلدي UDF ولكن من الواضح أنها لا تعمل. هل هناك أي وسيلة لأخذ VARCHAR أو سلسلة من نوع ما والحصول على مرجع الجدول التي يمكن أن تعمل في عبارة FROM؟

CREATE FUNCTION TemplateSelector 
(   
@template varchar(40),
@code varchar(80)
)
RETURNS TABLE 
AS
RETURN 
(
SELECT * FROM @template WHERE ProductionCode = @code
)

وأو بطريقة أخرى للحصول على نتيجة تعيين في مفهوم مماثل لهذا. أساسا كل السجلات في الجدول أشارت من قبلtemplate VARCHAR مع ProductionCode مطابقة للcode.

وأحصل على خطأ "يجب تعريف المتغير الطاولة"template ""، لذلك الخادم SQL ربما أشياء أحاول لتحديد من متغير الجدول.

في تحرير: نعم ولست بحاجة للقيام بذلك في وظيفة، لا أستطيع تشغيل Procs مخزنة، لقد قمت للتو لم يكتب أي منهم قبل

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

المحلول

CREATE PROCEDURE TemplateSelector 
(   
    @template varchar(40),
    @code varchar(80)
)

AS
EXEC('SELECT * FROM ' + @template + ' WHERE ProductionCode = ' + @code)

وهذا يعمل، على الرغم من انها ليست UDF.

نصائح أخرى

والطريقة الوحيدة للقيام بذلك هي مع الأمر إكسيك.

وبالإضافة إلى ذلك، عليك ان تتحرك بها إلى بروك المخزنة بدلا من وظيفة. على ما يبدو وظائف لا يمكن تنفيذ مزود الحيوية.

والطريقة الوحيدة التي من شأن ذلك أن يكون من الممكن لمع SQL ديناميكية، ومع ذلك، لا يتم اعتماد SQL حيوي SQLSERVER داخل دالة.

وأنا آسف أن أقول إنني متأكد تماما أنه ليس من الممكن القيام بذلك داخل دالة.

إذا كنت تعمل مع الإجراءات المخزنة كان من الممكن.

وبالإضافة إلى ذلك، تجدر الإشارة إلى أن يتم استبدال اسم الجدول في الاستعلام، وكنت قد دمر القدرة SQL خادم لتخزين خطة التنفيذ للاستعلام. هذا الى حد كبير يقلل من ميزة استخدام UDF أو SP إلى لا شيء. بالاضافة الى انك قد مجرد دعوة الاستعلام SQL مباشرة.

ولدي عدد محدود من الجداول التي أريد أن أكون قادرة على معالجة، حتى أتمكن من كتابة شيء باستخدام IF، أن الاختباراتtemplate للمباريات مع عدد من القيم ولكل يدير مباراة

SELECT * FROM TEMPLATENAME WHERE ProductionCode = @code

وهذا يبدو وكأنه هذا هو الخيار الأفضل

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

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