2012-11-16 83 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 - 完成:-) –