Sql server 为什么创建的T-SQL函数会复制数据?

Sql server 为什么创建的T-SQL函数会复制数据?,sql-server,function,Sql Server,Function,我是新手,所以如果我没有遵守论坛协议,我会提前道歉 我试图在T-SQL中创建一个函数,该函数根据两个参数计算产品价格的GST;ProductID和GST\u百分比 (10%) 如果您检查我当前输出结果的图像,您将看到我的问题。我希望返回一条记录,因为我只输入了一条ProductID作为输入参数,但表中的所有记录都会返回,输入的ProductID的预期计算GST是正确的,但也会显示所有不需要的记录 我已经试了几个小时想弄清楚我做错了什么,但似乎没办法弄清楚。请帮忙 CREATE FUNCTION

我是新手,所以如果我没有遵守论坛协议,我会提前道歉

我试图在T-SQL中创建一个函数,该函数根据两个参数计算产品价格的GST;
ProductID
GST\u百分比
(10%)

如果您检查我当前输出结果的图像,您将看到我的问题。我希望返回一条记录,因为我只输入了一条
ProductID
作为输入参数,但表中的所有记录都会返回,输入的
ProductID
的预期计算GST是正确的,但也会显示所有不需要的记录

我已经试了几个小时想弄清楚我做错了什么,但似乎没办法弄清楚。请帮忙

CREATE FUNCTION fn_CalculateGST 
    (@ProductID INT,
     @GST_Percentage FLOAT)
RETURNS MONEY
AS
BEGIN
    DECLARE @Price MONEY

    SET @Price = (SELECT Price
                  FROM Products
                  WHERE ProductID = @ProductID)

    RETURN @Price * @GST_Percentage
END
GO
下面是我用来测试函数的
SELECT
语句

SELECT  
    ProductID, ProductDescription, 
    Price, dbo.fn_CalculateGST(1, 0.10) AS GST 
FROM    
    Products 
输出结果:


好吧,您总是将
1
作为第一个参数(
@ProductID
)传递到您的
SELECT
语句中的函数中-因此它总是计算15.00的10%-也就是1.50-因此输出是正确的

但你可能想要这样的东西:

SELECT
    ProductID, ProductDescription,
    Price, dbo.fn_CalculateGST(ProductID, 0.10) AS GST
    --                         ********* pass in ProductID - not always 1 !!!!
FROM
    Products

请参阅:您需要将
ProductID
列值传递到您的函数中-不总是1….

您的期望是错误的。您的查询,即最后一个代码示例SELECT,没有
WHERE
子句,因此它将返回
products
表中的所有产品,并且对于每个这样的产品,您的函数都将返回。对于该行,该函数将返回与产品id 1相关的内容。但是,对于每种产品,它都会这样做。简而言之,您的最终SQL还需要一个
WHERE
子句,将其限制为仅包含一行。