سؤال

لدي تقرير في SSRS 2005 يستند إلى استعلام مشابه لهذا:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'

أحتاج إلى أن أكون قادرًا على تضمين جزء AND من جملة WHERE ديناميكيًا في الاستعلام بناءً على ما إذا كان المستخدم قد قام بتحديد خانة الاختيار.في الأساس، هذه عبارة SQL ديناميكية وهذه هي المشكلة.لقد حاولت عدة طرق دون جدوى.هل هذا ممكن؟هل يدعم SSRS 2005 SQL الديناميكي؟شكرًا!

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

المحلول

كان لدى تشارلز تقريبًا الإجابة الصحيحة.

ينبغي أن يكون:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
   AND (@checked = 0 OR col2 LIKE '%XYZ%')

هذا هو "النمط" الكلاسيكي في SQL للمسندات الشرطية.لو @checked = 0, ، فسوف يُرجع جميع الصفوف المطابقة لبقية المسند (col1 = 'ABC').لن يقوم SQL Server حتى بمعالجة النصف الثاني من ملف OR.

لو @checked = 1 ثم سيتم تقييم الجزء الثاني من OR وإرجاع مطابقة الصفوف col1 = 'ABC' AND col2 LIKE '%XYZ%'

إذا كان لديك العديد من المسندات الشرطية، فيمكن ربطها معًا باستخدام هذه الطريقة (بينما ستصبح أساليب IF وCASE غير قابلة للإدارة بسرعة).

على سبيل المثال:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
    AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
    AND (@checked2 = 0 OR col3 LIKE '%MNO%')

لا تستخدم SQL الديناميكي، ولا تستخدم IF أو CASE.

نصائح أخرى

وماذا عن هذا.@checked هو متغير البت الخاص بك.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')

يحرر: وأيضًا، إذا كنت لا تستخدم عملية مخزنة، فاستخدم واحدًا.

ربما هذا من شأنه أن يصلح لك:

if @checked = 1
    select * from mytable (nolock) where col = 'ABC'
else
    select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'

أنا آسف لأنني لا أستخدم SSRS كثيرًا، ولكن إذا كان بإمكانك الحصول على قيمة مربع الاختيار في المعلمة @checked، فيجب أن ينجح هذا.

بدلاً من ذلك، يمكنك استخدام عبارة CASE WHEN.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END

قد يعمل هذا في SSRS 2000 ولكنه يُستخدم كحل أخير.

(سيء) الكود الكاذب

="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")

الدفع تنفيذ استعلامات SQL "الديناميكية"..من دليل Hitchhiker لخدمات تقارير SQL Server 2000

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

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")

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

يمكنك أيضًا اتباع نهج آخر واستخدام وظيفة Exec:

DECLARE @CommonSelectText varchar(2000)  
DECLARE @CompleteSelectText varchar(2000)  
SELECT @CommonSelectText = 'SELECT * FROM MyTable (nolock) Where Col = ''ABC'' '  

IF @checked = 1   
    SELECT @CompleteSelectText = @CommonSelectText + ' AND ColW LIKE ''%XYZ%'' '  
ELSE  
    SELECT @CompleteSelectText = @CommonSelectText  

EXEC (@CompleteSelectText)  

GO  

لاحظ استخدام فاصلتين ' لوضع علامة على النص المقتبس.

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