以下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,因为它无法比较。
是XLFilES
有image
列,但在这种情况下,FDSCorp.XLFILES
不存在,因此不会运行不同的代码。
为数据库中的每个表生成此代码,我知道代码的这一部分永远不会在由于不同问题而失败的表上运行。
我真的不希望过度复杂化代码检查的类型,如果在真实情况下这种情况永远不会发生,我就无法使用它们。
我有什么方法可以绕过这个检查吗?
答案 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
,因为就这个批处理而言,它只是一个字符串文字。