标量函数与存储过程vs INSERT INTO新表

时间:2015-04-01 10:39:08

标签: sql-server function

A)创建函数并在查询中调用它后,我注意到它在“Reports”列中返回“Qualified”和“NULL”结果。由于明显的原因,这并不好。简化其背后的逻辑正是让我疯狂的原因。如何添加子句 - 无法添加子句?我是否必须通过一些转换来改变函数,将结果插入表中然后执行一个函数,也许是另一个变量?我错过了什么?

B)我的整个论点是,为什么在查询带有SELECT语句中的函数的[dbo]。[FactInternetSales]表时,我不能添加WHERE子句?是否应该在函数本身中进行此更改以便能够使用WHERE子句返回结果?如果是这样,我该如何做呢?

ALTER FUNCTION [dbo].[ExTaxQual]
                    (@Val1 money 
                    ,@Val2 money) 
                    RETURNS char(4) AS
    BEGIN 
        DECLARE @result char(4) 

            IF (@Val1 + @Val2) > 1000
                SET @result = 'Qualified'
                ELSE
                SET @result = NULL
            RETURN
                    @result
    END

我的疑问:

SELECT 
        [ExtendedAmount]
       ,[TaxAmt]
       ,[dbo].[ExTaxQual]([ExtendedAmount]
                ,[TaxAmt]) AS 'Reports'
FROM
        [dbo].[FactInternetSales]

结果..

  

选择         [ExtendedAmount]        [TaxAmt]        [DBO]。[ExTaxQual]([ExtendedAmount]                  ,[TaxAmt])AS'报告'来自[dbo]。[FactInternetSales]   ------------------------ * /

     

(60398行受影响)

这几乎不够一致。

B)也许以下示例更清晰

SELECT [ExtendedAmount]
      ,[TaxAmt]
      ,[dbo].[ExTaxQual](
                         [ExtendedAmount]
                        ,[TaxAmt]) 
AS Report

FROM [dbo].[FactInternetSales]

WHERE [ExtendedAmount] + [TaxAmt] = 'Qualified'
------------------------------VS
SELECT [ExtendedAmount],
       [TaxAmt],
       'Qualified' AS Reports
FROM   [dbo].[FactInternetSales]
WHERE  [ExtendedAmount] + [TaxAmt] > 1000

1 个答案:

答案 0 :(得分:1)

如果您只想获取合格记录的报告,请使用此报告。

SELECT [ExtendedAmount],
       [TaxAmt],
       'Qualified' AS Reports
FROM   [dbo].[FactInternetSales]
WHERE  [ExtendedAmount] + [TaxAmt] > 1000

此查询提供合格记录和非合格记录的报告。在这里你根本不需要功能。

SELECT [ExtendedAmount],
       [TaxAmt],
       CASE
         WHEN [ExtendedAmount] + [TaxAmt] > 1000 THEN 'Qualified'
         ELSE 'Not Qualified'
       END AS Reports
FROM   [dbo].[FactInternetSales]