SQL 2008 Cursor нужен?

Я создаю функцию для возврата чистой стоимости счета-фактуры на продажу после того, как будут сняты какие-либо выставленные на нее счета-фактуры. Часть этих затрат – это затраты подрядчика, из которых мы также хотим рассчитать либо NI, либо увеличение набора для подрядчика платить за отражение «истинной» стоимости.

Таким образом, на одном счете-фактуре на продажу у нас может быть несколько подрядчиков, где у нас есть счета-фактуры против него, некоторые из них могут быть в NI, рассчитанные на 13,8%, другие могут быть стандартным «поднятием» 10%, а другие могут быть добавлены в 0%.

Бит, который я пытаюсь выяснить, заключается в том, что мне нужно сделать всю функцию курсором, поскольку будут разные цифры для переменной для каждого счета-фактуры на покупку, например

(SELECT SUM(th.hoursworked * (th.payrate * (1 + (@NIAMOUNT / 100))) ) 

но @NIAMOUNT придется менять для каждого счета-фактуры.

Это лучший способ сделать это с помощью курсора, или есть лучший способ сделать это?

Извините, если это немного подробный!

Вы должны избегать курсоров, где это возможно – курсоры работают «последовательно», что ограничивает производительность SQL.

Если расчет прост, одним из способов сделать это будет сделать поиск в NI inline, например

 (SELECT SUM(th.hoursworked * (th.payrate * (1 + ((CASE somejoinedtable.UpliftType WHEN 1 THEN 10 WHEN 2 THEN 13.8 WHEN 3 THEN 0 END / 100)))) 

Если это становится слишком грязным, чтобы сделать встроенный, вы можете абстрагироваться от определенной пользователем функции

 CREATE FUNCTION dbo.fnGetNIAmount(int @someLookupParam) ... 

И тогда сделайте так

 (SELECT SUM(th.hoursworked * (th.payrate * (1 + ((dbo.fnGetNIAmount(somejoinedtable.UpliftType ) / 100)))) 

Вам почти наверняка не нужен курсор

Объедините свои часы с контрактом, на котором они основаны, и возьмите стоимость NI из контракта.

  • Курс SQL приводит к бесконечному циклу
  • Как получить счет между датами и записать количество строк в таблицу с T-SQL?
  • Проблема с SQL Server 2000 Cursor Not Fetching NEXT
  • Как зафиксировать внутри цикла CURSOR?
  • Обновление 13 миллионов строк - SQL Server 2008
  • Попытка изменить базы данных с помощью курсора, но база данных не изменится
  • Обновление триггера без курсора
  • SQL Server: вставить курсор в хранимой процедуре
  • Сбросить или обновить целое число строк строки в таблице базы данных
  • Обновить данные в строке курсора, еще не загруженной sql-сервером
  • Использование курсора в базах данных OLTP (SQL-сервер)
  • Interesting Posts

    SQL: Weird производительность запроса после «выбрать в» новую таблицу

    Усекать nvarchar (max) до nvarchar (n) с эллипсами

    При сбросе ограничения будут также отменены поддерживающие индексы?

    Импорт реляционных данных в SQL Server с использованием XML

    Алгоритм SQL дает недопустимое имя столбца

    Невозможно преобразовать строку dd-mm-yyyy dateformat в datetime в SQL Server

    Как определить, исключено ли исключение для проверки ссылочной целостности

    Общий объем данных (несколько MDF) и другой общий том для журналов (несколько LDF) в SAN

    Работа с & # x0D в SSIS

    есть эквивалент SQL Server PostgreSQL «select * for update» без открытия курсора

    Получить все таблицы с первичным ключом с уникальным идентификатором типа данных в SQL Server

    Вычислить несколько столбцов друг с другом с помощью CTE

    Время UTC в таблицах SQL

    Запрос Sql для возврата SUM и # строк, соответствующих запросу

    Невозможно заставить SQL IF-оператор работать: получение: идентификатор многочастности «d.ExpiryDate» не может быть связан

    Давайте будем гением компьютера.