0

私は理にかなっている非常に単純なことをやっています、

IF EXISTS(SELECT * FROM sysobjects WHERE xtype = 'TF' AND name = 'GetGeographyFromSourceID')
BEGIN
    DROP FUNCTION dbo.GetGeographyFromSourceID
END
GO

CREATE FUNCTION dbo.GetGeographyFromSourceID
(
    @SourceID INT
)
RETURNS  GEOGRAPHY
AS
BEGIN
    DECLARE @Longitude FLOAT = 0; 
    DECLARE @Latitude FLOAT = 0; 
    DECLARE @Geo GEOGRAPHY;

    SELECT  @Longitude = Longitude, 
            @Latitude = Latitude 
    FROM    Sources 
    WHERE   ID = @SourceID; 

    SELECT @Geo = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR( 100), @Longitude) + ' ' + CONVERT( VARCHAR( 100),@Latitude) + ')', 4326);

    RETURN(@Geo)
END

存在する場合は、削除して再作成してください。しかし、私はエラーが発生していますThere is already an object named 'XXX' in the database?

4

4 に答える 4

5

テーブル値関数がデータベースに存在するかどうかをテストしていますが、記述した関数はテーブルを返しません。コードの最初の部分 (go の前) をこれに置き換えて、もう一度やり直してください。

IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'GetGeographyFromSourceID') 
    AND xtype IN (N'FN', N'IF', N'TF')
)
    DROP FUNCTION GetGeographyFromSourceID
GO
于 2013-02-27T15:42:16.380 に答える
4

DROP FUNCTION ステートメントに実際にヒットしていないようです。これは、xtype = 'TF'これが試行されていないテーブル関数のみを検索することを確認しているためですxtype='FN'(スカラー関数)

MSDN リファレンス

于 2013-02-27T15:42:36.833 に答える
3

TFではなくFNに変更

IF EXISTS(SELECT * FROM sysobjects WHERE xtype = 'FN' AND name = 'GetGeographyFromSourceID')
BEGIN
    DROP FUNCTION dbo.GetGeographyFromSourceID
END
GO

CREATE FUNCTION dbo.GetGeographyFromSourceID
(
    @SourceID INT
)
RETURNS  GEOGRAPHY
AS
BEGIN
    DECLARE @Longitude FLOAT = 0; 
    DECLARE @Latitude FLOAT = 0; 
    DECLARE @Geo GEOGRAPHY;

    SELECT  @Longitude = Longitude, 
            @Latitude = Latitude 
    FROM    Sources 
    WHERE   ID = @SourceID; 

    SELECT @Geo = geography::STGeomFromText('POINT(' + CONVERT(VARCHAR( 100), @Longitude) + ' ' + CONVERT( VARCHAR( 100),@Latitude) + ')', 4326);

    RETURN(@Geo)
END
于 2013-02-27T15:42:30.770 に答える
1

これはすでに回答されていることは知っていますが、ポイントを追加するだけです。SQL がオブジェクト名を処理する方法を考えると、通常、このタイプのコードを使用する場合はチェックしないことが最善です。オブジェクトを作成すると、名前とタイプの組み合わせではなく、名前で一意になります。また、OBJECT_ID 関数を使用して確認する簡単な方法もあります。master データベースで行ったいくつかの例を次に示します。

IF (OBJECT_ID('sysobjects') IS NOT NULL)
    PRINT OBJECT_ID('sysobjects')

IF (OBJECT_ID('sys.sysobjects') IS NOT NULL)
    PRINT OBJECT_ID('sys.sysobjects')

IF (OBJECT_ID('xyz') IS NOT NULL)
    PRINT OBJECT_ID('xyz')

最初の 2 つは true と評価されて印刷を実行し (同じオブジェクト ID を与える)、3 つ目は false と評価されて印刷を実行しません。

于 2013-02-27T15:55:27.510 に答える