无法访问的SQL代码出错

时间:2012-11-16 09:28:50

标签: sql sql-server tsql

以下tsql失败:

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;

错误:

  

无法将图像数据类型选为DISTINCT,因为它无法比较。

XLFilESimage列,但在这种情况下,FDSCorp.XLFILES不存在,因此不会运行不同的代码。

为数据库中的每个表生成此代码,我知道代码的这一部分永远不会在由于不同问题而失败的表上运行。

我真的不希望过度复杂化代码检查的类型,如果在真实情况下这种情况永远不会发生,我就无法使用它们。

我有什么方法可以绕过这个检查吗?

1 个答案:

答案 0 :(得分: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,因为就这个批处理而言,它只是一个字符串文字。