【问题标题】:Scalar Function vs Stored Proc vs INSERT INTO new Table标量函数 vs 存储过程 vs 插入新表
【发布时间】:2015-04-01 10:39:07
【问题描述】:

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

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]

结果..

选择 [扩展金额] ,[税额] ,[dbo].[ExTaxQual]([ExtendedAmount] ,[TaxAmt]) 作为来自 [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

【问题讨论】:

  • 你的预期输出是什么?
  • 当你在做的时候:你的意见是什么?哪些参数值会产生NULL 值?
  • @papatoob 参数是添加的两个数量,等于“结果”>1000。我不希望函数显示参数为 NULL 的位置
  • 我根本没有从这个问题中得到答案。那么请参阅 NewUser 的答案...
  • 我已尽我所能编辑了我的问题。 @papatoob

标签: sql-server function


【解决方案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] 

【讨论】:

  • 这有帮助。这很有趣,因为在我问这个问题之前我确实运行了几次,它一直返回没有数据的列名。这可能是一个错误的查询。 ThanQ 人 :)
  • 第一个是我需要查询的函数。完美运行。不幸的是,我还是个新手,所以我不能投票给你的答案。
猜你喜欢
  • 2012-07-12
  • 2011-11-28
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2013-07-23
  • 2019-08-07
  • 2016-04-24
  • 2014-10-27
相关资源
最近更新 更多