0

我正在尝试创建一个函数,并且我已经在数据库中拥有该函数。为了绕过这一点,我使用了 drop 函数,但我仍然不断得到“数据库中已经存在名为 'getCost' 的对象”。可能是什么原因?

询问:

USE DWDB_PROPER;
GO
IF OBJECT_ID (N'dbo.getCost', N'TF') IS NOT NULL
DROP FUNCTION dbo.getCost;
GO
CREATE FUNCTION getCost(@person VARCHAR(10), @month TINYINT, @year SMALLINT, @Category    VARCHAR(20))
RETURNS INT 
AS
BEGIN
--function body here
4

2 回答 2

6

你的是一个标量函数,因为它只返回一个值,所以在 if 子句中你应该提到 FN 而不是 TF.Read this

USE DWDB_PROPER;
GO
IF OBJECT_ID (N'dbo.getCost', N'FN') IS NOT NULL
DROP FUNCTION dbo.getCost;
GO
CREATE FUNCTION getCost(@person VARCHAR(10), @month TINYINT, @year SMALLINT, @Category       VARCHAR(20))
RETURNS INT 
AS
BEGIN
--function body here

您正在返回单个值而不是表。所以 RETURNS int 是一个多选标量函数,其中 Returns Table 是一个表值函数

于 2012-08-05T12:49:18.830 回答
2

尝试以下查询:

USE DWDB_PROPER;
GO
IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'dbo.getCost') 
    AND xtype IN (N'FN', N'IF', N'TF')
)
    DROP FUNCTION dbo.getCost
GO
CREATE FUNCTION getCost(@person VARCHAR(10), @month TINYINT, @year SMALLINT, @Category    VARCHAR(20))
RETURNS INT 
AS
BEGIN
于 2012-08-05T12:38:50.510 回答