none
Syntax error: Missing operand after 'tblFamiliesInSale' operator. RRS feed

  • שאלה

  • ‏שלום,

    יש לי string ובו תנאי בsql, כאשר אני שולחת אותו כwhere לsql server, אני מקבלת תוצאה מצוינת. אך כאשר אני משתמשת באותו טקסט בדיוק כrowFilter בdataview אני מקבלת את השגיאה : 

    Syntax error: Missing operand after 'tblFamiliesInSale' operator.

    הקוד הוא: 

     dvFamilies = new DataView(ut.GetDisplayTable(initFilter));
                dvFamilies.RowFilter = filter;

    כאשר גם ב "filter" וגם ב"rowfilter" התוכן הוא זהה בשלב זה (זו פעולת refresh כללית, כאשר הfilter משתנה והinitFilter שומר את המסנן הראשוני לצורך חזרה להגדרות הראשונות של המסך).  והוא:  

    id in (select tblFamiliesInSale.familyId from tblFamiliesInSale where tblFamiliesInSale.seasonCode in(select top 3 c.scode from (select  Max(tblsales.saleDate)as m,tblSales.seasonCode as scode from tblSales where tblSales.saleDate < convert(datetime, '03-11-2018') group by tblSales.seasonCode) as c order by c.m desc) and tblFamiliesInSale.fisStatus <3 group by tblFamiliesInSale.familyId having count(tblFamiliesInSale.familyId)>2)

    יום ראשון 11 מרץ 2018 09:39

כל התגובות

  • יום טוב וברוך הבא לפורום

    הדרך הכי טובה לנטר את הבעיה היא לבדוק מה בפועל הגיע לשרת ואז להגיע למקור הבעיה. אתה יכול לנטר את השאילתות שמגיעות לשרת בעזרת SQL Server Profiler (מתאים בעיקר לגרסאות ישנות) או בעזר SQL Server Extended Event.

    בינתיים: אתה יכול לנסות להוריד מהשאילתה את כל החלקים שמזכירים את שם הטבלה פרט לחלק של ה FROM. מכיוון שאתה עובד עם טבלה בודדת בשאילתה אתה יכול פשוט לעשות שימוש בשם הטור. הבעיה קשורה לפורמט של השימוש בשם הטבלה וזה יוכל לעזור להשאיר רק מיקום אחד פוטנציאלי. הבעיה יכולה להיות קשורה לשימוש בנקודה בשם הטבלה+טור.

    הערה: כאשר שם הטור כולל סימנים מיוחדים (לא המקרה שלך) אז הפתרון הוא פשוט להכניס את השם של הטור בתוך סוגריים מרובעים.

    ז"א במקום הקוד הראשון לעבוד עם הקוד השני

    id in (
        select tblFamiliesInSale.familyId 
        from tblFamiliesInSale 
        where 
            tblFamiliesInSale.seasonCode in(
                select top 3 c.scode 
                from (
                    select  Max(tblsales.saleDate)as m,tblSales.seasonCode as scode 
                    from tblSales 
                    where tblSales.saleDate < convert(datetime, '03-11-2018') 
                    group by tblSales.seasonCode
                ) as c 
                order by c.m desc
            ) 
            and tblFamiliesInSale.fisStatus <3 
        group by tblFamiliesInSale.familyId 
        having count(tblFamiliesInSale.familyId)>2
    )
    
    
    
    id in (
        select familyId 
        from tblFamiliesInSale 
        where 
            seasonCode in(
                select top 3 c.scode 
                from (
                    select  Max(tblsales.saleDate)as m,tblSales.seasonCode as scode 
                    from tblSales 
                    where tblSales.saleDate < convert(datetime, '03-11-2018') 
                    group by tblSales.seasonCode
                ) as c 
                order by c.m desc
            ) 
            and fisStatus <3 
        group by familyId 
        having count(familyId)>2
    )

    הערה: RowFilter נועד בעקרון לתנאי קצרים ואני לא ממש בטוח כיצד הוא יתפקד עם שאילתות משנה רבות ומורכבות, וגם כך יש ו מדבלות על תווים מיוחדים...

    אתה יכול לעבוד עם שאילתות מורכבות ככל שאתה רוצה בעזרת שימוש בשאילתות ישירות אשר מסננות את המידע אם צריך בעזרת EnumerableRowCollection למשל משהו כפי שמוצג במסמך הרשמי הבא בדוגמה השנייה

    https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/filtering-with-dataview-linq-to-dataset


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום ראשון 11 מרץ 2018 22:07
    מנחה דיון