0

関数を作成しようとしていますが、既にデータベースにその関数があります。これを回避するためにドロップ機能を使用していますが、「データベースに「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

yours はスカラー関数であり、値を返すだけなので、if 句では TF ではなく FN に言及する必要があります。これを読んでください

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 は複数選択のスカラー関数であり、リターン テーブルはテーブル値関数です。

于 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 に答える