日期:2014-05-18  浏览次数:20745 次

外联SQL语句与数据兼容级别的问题
SELECT T.YSXZXXB_JJFZ, T.YSXZXXB_CZF, T1.YSJGB_YSDJ, T3.CZJGB_YSDJ as czYSDJ 
FROM T_YHYSXZB M, T_YSXZXXB T, T_YSJGB T1, T_YSJGB T2,T_YHSBXXB B,T_CZJGB T3

WHERE T1.YSJGB_YSJGBH=T.YSXZXXB_JJFZ AND T2.YSJGB_YSJGBH=*T.YSXZXXB_CZF  
AND T3.CZJGB_YSJGBH=T.YSXZXXB_CZF
AND M.YHYSXZB_YSSZBM= T.YSXZXXB_YSXZBH AND M.T_YHSBXXB_SYSID =B.YHSBXXB_SYSID

在SQLServer2005中,会有如下错误:消息 4147,级别 15,状态 1,过程 DATA_IMPORT,第 138 行
此查询使用的不是 ANSI 外部联接运算符("*=" 或 "=*")。若要不进行修改即运行此查询,请使用存储过程 sp_dbcmptlevel 将当前数据库的兼容级别设置为 80 或更低。极力建议使用 ANSI 外部联接运算符(LEFT OUTER JOIN、RIGHT OUTER JOIN)重写此查询。在将来的 SQL Server 版本中,即使在向后兼容模式下,也不支持非 ANSI 联接运算符。

当然,这里可以通过设置兼容级别:
SQL codeEXEC SP_DBCMPTLEVEL 'TABLE_NAME','90'
来使这段SQL能够顺利通过,但是我希望能够直接修改这段SQL,让它能够既满足2k,也满足2005的语法标准,请教各位大大了,这里的左联应该怎么写呢?


------解决方案--------------------
("*=" 或 "=*")这种写法是ANSI89的语法,MSSQL2008已经不支持了。并且你这里的INNER JOIN内联接的写法,使用where子句来实现,以后也将被放弃,因此建议你这样改写:
SELECT T.YSXZXXB_JJFZ, 
T.YSXZXXB_CZF, 
T1.YSJGB_YSDJ, 
T3.CZJGB_YSDJ as czYSDJ
FROM T_YSXZXXB T INNER JOIN
T_YHYSXZB M ON M.YHYSXZB_YSSZBM=T.YSXZXXB_YSXZBH INNER JOIN
T_YHSBXXB B ON M.T_YHSBXXB_SYSID=B.YHSBXXB_SYSID INNER JOIN
T_YSJGB T1 ON T1.YSJGB_YSJGBH=T.YSXZXXB_JJFZ INNER JOIN
T_CZJGB T3 ON T3.CZJGB_YSJGBH=T.YSXZXXB_CZF LEFT JOIN
T_YSJGB T2 ON T2.YSJGB_YSJGBH=T.YSXZXXB_CZF