2012-11-16 103 views
0

下面的TSQL失敗:錯誤無法訪問SQL代碼

IF OBJECT_ID('FDSCorp.XLFILES') IS NOT NULL 
BEGIN 
    DELETE FROM FDSCorp.XLFILES; 

    INSERT INTO FDSCorp.XLFILES 
     SELECT DISTINCT * FROM dbo.XLFILES; 
END 
ELSE 
    exec sp_changeobjectowner XLFILES, FDSCorp; 

錯誤:

The image data type cannot be selected as DISTINCT because it is not comparable.

XLFilESimage列,但在這種情況下FDSCorp.XLFILES不存在使不同的代碼會永遠不會跑步。

該代碼是爲數據庫中的每個表生成的,並且我知道這部分代碼將永遠不會在可能由於不同問題而失敗的表上運行。

我真的不想過分複雜的代碼檢查類型,我不能使用明確的,如果這種情況永遠不會發生在真實的情況。

有什麼方法可以繞過此檢查嗎?

+0

你可以明確**指定** INSERT INTO ...和SELECT DISTINCT ....語句中的列表列表,然後跳過'IMAGE'列.... –

+0

不要使用已棄用的'image'類型。如果你使用'varbinary(max)',那麼你不會得到這個問題。 –

+0

這是從Access到SQL的轉換後運行的腳本的一部分,所以我無法控制類型是什麼。此外每個表都有不同的列等,所以我不能列出它們。 – pholcroft

回答

3

避免錯誤的唯一方法是讓您防止服務器「看到」您不希望它編譯的代碼。每批完全彙編(包括每個語句,忽略控制流)的執行開始之前:

IF OBJECT_ID('FDSCorp.XLFILES') IS NOT NULL 
BEGIN 
    DELETE FROM FDSCorp.XLFILES; 

    exec sp_executesql N'INSERT INTO FDSCorp.XLFILES 
     SELECT DISTINCT * FROM dbo.XLFILES;'; 
END 
ELSE 
    exec sp_changeobjectowner XLFILES, FDSCorp; 

現在,當此批被編譯,它不會試圖編譯INSERT,因爲只要這個批次有關,它只是一個字符串文字。

+0

謝謝,這正是我所需要的。隨着N的加入,這個工作非常完美。 – pholcroft

+0

@pholcroft - 完成:-) –