Несколько вычислений в инструкции SQL — другой результат

#sql #sql-server #vb.net #case

#sql #sql-server #vb.net #случай

Вопрос:

Я пытаюсь решить, почему оператор sql в vb.net код дает мне другие результаты, чем в sql server. Мой код:

                             strsql = "SELECT DISTINCT DateName(mm,DATEADD(mm,lgdatm,-1)) as lgMon, Avi,  SUM((ProcElaps / 60) / Emplo) as Util, Effi, SUM(((ProcElaps / 60) * Avi) / Emplo) as DayProd, ProcElaps, ProcCount, NonProcCount FROM " amp; _
        "(SELECT DISTINCT lgdatm, Emplo, SUM((Emplo - (NonProcElaps / 60)) / Emplo) as Avi, SUM((ProcElaps / 60) / (Emplo- (NonProcElaps / 60))) as Effi, ProcElaps, ProcCount, NonProcCount FROM " amp; _
    "(SELECT DISTINCT lgdatm, SUM(460 * lgdat * EmpCount) as Emplo, NonProcElaps, ProcElaps, ProcCount, NonProcCount FROM " amp; _
    "(SELECT DISTINCT MONTH(LogDate) AS lgdatm, " amp; _
                    "Count(DISTINCT " amp; _
                    "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN Enumber ELSE '0' END) AS EmpCount, " amp; _
                    "Count(DISTINCT " amp; _
                    "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN LogDate ELSE LogDate END) lgdat, " amp; _
                    "Count(" amp; _
                    "CASE WHEN (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN FirstActivity ELSE '0' END) AS ProcCount, " amp; _
                    "Count(" amp; _
                    "CASE WHEN (ActivityCategory = @ActivAcnon) AND (MONTH([LogDate]) = @LGDat) THEN FirstActivity ELSE '0' END) AS NonProcCount, " amp; _
                    "SUM(" amp; _
                    "CASE WHEN  (ActivityCategory = @ActivAc) AND (MONTH([LogDate]) = @LGDat) THEN Elapsed ELSE '0' END) ProcElaps, " amp; _
                    "SUM(" amp; _
                    "CASE WHEN  (ActivityCategory = @ActivAcnon) AND (MONTH([LogDate]) = @LGDat) THEN Elapsed ELSE '0' END) NonProcElaps " amp; _
    "FROM tblMain WHERE MONTH([LogDate]) = @LGDat " amp; _
    "GROUP BY MONTH(LogDate)) AS T1 " amp; _
    "Group By lgdatm, EmpCount, NonProcElaps, ProcElaps, ProcCount, NonProcCount) AS T2 " amp; _
    "Group BY lgdatm, Emplo, ProcElaps, ProcCount, NonProcCount) As T3 " amp; _
    "Group BY lgdatm, Avi, Effi, ProcElaps, ProcCount, NonProcCount Order By DayProd, Util, Avi, Effi"
                        Dim da As New SqlDataAdapter(strsql, cnn)
                        Dim ds As New DataSet()
                        da.SelectCommand.Parameters.AddWithValue("@ActivAc", proc)
                        da.SelectCommand.Parameters.AddWithValue("@ActivAcnon", nonproc)
                        da.SelectCommand.Parameters.AddWithValue("@LGDat", Mon)
                        da.Fill(ds, "Productivity")
                        txtDayProductivity.Text = Format(ds.Tables(0).Rows(0)(4).ToString(), "Percent")
                        txtAvailabilityTeam.Text = Format(ds.Tables(0).Rows(0)(1).ToString(), "Percent")
                        txtEfficiencyTeam.Text = Format(ds.Tables(0).Rows(0)(3).ToString(), "Percent")
                        txtUtilizationTeam.Text = Format(ds.Tables(0).Rows(0)(2).ToString(), "Percent")
                        txtTotLogg.Text = (ds.Tables(0).Rows(0)(5).ToString()) / 60
                        txtTotalTimeLogged.Text = (CDec(txtTotLogg.Text).ToString("N2")) amp; " mins"
                        txtAllProcess.Text = ds.Tables(0).Rows(0)(6).ToString()
                        txtAllNonProcess.Text = ds.Tables(0).Rows(0)(7).ToString()
  

Когда я добавляю каждый поток в отдельный запрос, результаты сильно отличаются от тех, которые я получаю во время принудительного применения этого кода. Как вы думаете, это из-за РЕГИСТРА, или я неправильно использую РЕГИСТР.

(«@LGDat», Mon) — Mon — текущий месяц (число) («@ActivAc», proc) — Строка ‘Process’ («@ActivAcnon», nonproc) — Строка ‘Non-Process’

Спасибо за вашу помощь!

Комментарии:

1. Можете ли вы попытаться уменьшить размер вашего запроса — это поможет изолировать и решить проблему

2. постараюсь, спасибо

Ответ №1:

Чтобы выяснить разницу, запустите SQL Profiler и запустите vb.net код, чтобы проверить, какой запрос, наконец, отправляется на sql server.

Комментарии:

1. Мое приложение уже работает с несколькими пользователями (уже реализовано, я создаю только для модуля отчетов), однако я выполнил это упражнение в соответствии с вашим предложением, и этот запрос проходит через профилировщик sql. (RPC: завершено)

2. Вы проверили запрос в столбце TextData? В этом столбце будет указано, что именно vb.net отправка на sql server для выполнения.

3. Да, exec sp_executesql Не ВЫБИРАЕТ ОТДЕЛЬНОЕ имя даты(mm,DATEADD(mm,lgdatm,-1))… (слишком длинный) И это весь мой запрос с каждым случаем, СУММОЙ и т. Д.

4. Так это точно так же, как и то, что вы запускаете непосредственно в sql server.

5. Этот — да. например, для результата, не связанного с подсчетом, 31639, но когда я запускаю запрос только для столбца, не связанного с подсчетом: ВЫБЕРИТЕ COUNT(FirstActivity) из tblMain, ГДЕ MONTH(LogDate) = 6 и ActivityCategory = ‘Non-Process’, я получаю result = 3395 элементов, что правильно.