0

以下 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,因为它不可比较。

YesXLFilES有一个image列,但在这种情况下FDSCorp.XLFILES不存在,因此不同的代码永远不会运行。

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

如果这种情况在真实情况下永远不会发生,我真的不想让代码检查我无法使用 distinct 的类型过于复杂。

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

4

1 回答 1

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,因为就这个批次而言,它只是一个字符串文字。

于 2012-11-16T09:42:57.580 回答