Функция с двумя входами возвращает нулевое значение

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Мне нужно создать функцию, которая будет вычислять налог с продаж с учетом штата и суммы, подлежащей налогообложению. Если состояние не существует в таблице SalesTax, функция должна возвращать 0. Но когда я запускаю функцию, она просто возвращает нулевое значение, даже если состояние находится в таблице SalesTax. Что он должен возвращать, так это налоговая ставка (для каждого введенного штата) * количество (также вводится)

 GO Create or alter function TaxGivenAState (@State char(2),@Quantity NUMERIC) Returns NUMERIC  as  BEGIN  Declare @SalesTaxTotal NUMERIC   Declare @TaxRate NUMERIC   Select @SalesTaxTotal = @TaxRate*@quantity  From SalesTax s  Where s.TaxRate = @TaxRate and s.[State]=@State and @TaxRate=s.TaxRate  If(@SalesTaxTotal=0)  BEGIN  Return 0  END  ELSE  BEGIN  Return @SalesTaxTotal  END  return @salestaxtotal END  

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

1. Приведите пример вашей налоговой таблицы и таблицу ожидаемых результатов.

2. @Quantity NUMERIC Ты действительно понимаешь, что это значит? Каковы значения по умолчанию для точности и масштаба? Подходят ли они для вашего использования? Я часто вижу дробные налоговые ставки — в вашем кодексе этого нет. Не предполагайте — всегда указывайте атрибуты типов данных, которые могут отличаться.

Ответ №1:

Вы не инициализировали @TaxRate какое-либо значение, поэтому, null когда вы умножаете его @quantity , это всегда приводит к нулю:

 Declare @TaxRate NUMERIC Select @SalesTaxTotal = @TaxRate*@quantity  

FROM Компонент имеет практически нулевой эффект здесь, потому что вы вообще не используете значения из таблицы.

Попробуйте это, я удалил несущественные аспекты вашего запроса

 GO Create or alter function TaxGivenAState (@State char(2),@Quantity NUMERIC) Returns NUMERIC  as  BEGIN  Declare @SalesTaxTotal NUMERIC    Select TOP 1 @SalesTaxTotal = s.TaxRate*@quantity  From SalesTax s  Where s.[State]=@State   return @SalesTaxTotal END  

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