2013-02-27 39 views
0

我做的版本簡單的東西是有道理的,爲什麼我在數據庫中已經有一個名爲'XXX'的對象?

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?

+0

它沒有下降....如果存在....嘗試使用另一個條件....像count;) – Hackerman 2013-02-27 15:42:23

+0

剛剛檢查,發現它存在與類型FN。現在應該使用TF還是FN – user960567 2013-02-27 15:42:46

+0

還有其他名字嗎?嘗試從sysobjects中執行select *,其中name ='GetGeographyFromSourceID',並查看它是否是某種其他對象類型。 - 啊,你剛剛做到了! – 2013-02-27 15:43:14

回答

3

將其更改爲FN代替TF

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 
+0

是這是問題謝謝。 – user960567 2013-02-27 15:46:28

5

您正在測試數據庫中是否存在表值函數,但是您描述的函數不返回表。通過這個替換您的代碼(在去之前)的第一部分,然後再試一次:

IF EXISTS (
    SELECT * FROM sysobjects WHERE id = object_id(N'GetGeographyFromSourceID') 
    AND xtype IN (N'FN', N'IF', N'TF') 
) 
    DROP FUNCTION GetGeographyFromSourceID 
GO 
4

看起來它實際上沒有打你的DROP FUNCTION語句,因爲你檢查xtype = 'TF'只查找表功能,這這個人是不是嘗試xtype='FN'(標量函數)

MSDN Reference

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') 

前兩個會評估爲真,並運行打印(給予相同的對象ID)和第三個將評估爲假不運行打印。

相關問題