之前有段存储过程的代码,在SqlServer2000 中可以运行,最近把SqlServer升级到2005之后,代码不能通过编译,不知道怎么解决这个问题(前提是现在必须使代码在SqlServer2005上可以运行,而且不会影响代码的作用),代码如下:SELECT DISTINCT
IndividualID = NULL,
        DoNotContactInd     = 0,
        DoNotContactModifiedDateTime  = NULL,
DoNotContactSSCode = NULL,
        DoNotContactComment      = NULL,
        ValidEmailInd       = CASE  
WHEN NoEmailDate IS NOT NULL THEN 0
ELSE 1
END,
        DeliverableAddressInd     = NULL,
        FirstName           = CONVERT(nvarchar(50), FirstName),
        FirstNamePreferred  = NULL,
        MiddleName          = CONVERT(nvarchar(50), MiddleName),
        LastName1           = CONVERT(nvarchar(50), LastName1),
        LastName2           = CONVERT(nvarchar(50), LastName2),
        NamePrefix          = CONVERT(nvarchar(5), NamePrefixTxt),
        NameSuffix          = CONVERT(nvarchar(5), NameSuffixTxt),
        AddressID           = NULL,
        EmailAddress        = CONVERT(varchar(60), RTRIM(EmailName)),
        TelephoneNbr        = CONVERT(varchar(20), RTRIM(p.PhoneAreaCode) + RTRIM(p.PhoneNbr)),
        PCInfluenceNbr      = CONVERT(tinyint, CASE WHEN PCInfluenceNbr < 0 THEN -1*PCInfluenceNbr ELSE PCInfluenceNbr END),
        SoftwareRoleCode    = CONVERT(tinyint, SoftwareRoleCode),
        InfluenceLevelNbr   = CONVERT(tinyint, InfluenceLevelNbr),
        LanguageId          = (SELECT top 1 LanguageID 
   FROM HRDDW.dbo.Locale l
   WHERE l.LCID = r.LCIDLanguageId),
LastUpdatedDateTime = GetDate(),
LastUpdatedBy  = CONVERT(VARCHAR(20), SYSTEM_USER),
ActionCode  = 'I',
ProcessID = NULL,
        SourceSystemCode  = 7,
SourceSYstemIndivKey=  CONVERT(varchar(255), CONVERT(varchar(50), r.MSTransactionId) +':'+r.ProductMPCCode),
SourceSystemDateTime = isnull(convert(datetime, r.RowUpdatedDtTm), convert(datetime, r.RowCreatedDtTm)),
EmailSourceID = 1,
MailFormatID = 3,
        CountryID    = 
(SELECT CountryID FROM HRDDW.dbo.Country c
WHERE c.ISO2CountryCode = r.ISOCountryCode)
FROM 
SREG01ServerRegistrationS r,
SREG01RegPhoneNumberS p
WHERE
r.MSTransactionId  *= p.MSTransactionId  
AND r.ProductPID  *= p.ProductPID  
AND p.PhoneTypeCode = (SELECT MIN(p2.PhoneTypecode)
FROM SREG01RegPhoneNumberS p2
WHERE p2.MSTransactionId = r.MSTransactionId)
AND r.ProductMPCCode <> 'NOPID'
and r.ProductPID = 
(SELECT MIN (r2.ProductPID)
FROM SREG01ServerRegistrationS r2
WHERE r.MSTransactionId = r2.MSTransactionId
AND r.ProductMPCCode = r2.ProductMPCCode)
运行之后,错误信息如下:
Msg 4147, Level 15, State 1, Procedure V_SREG01Individual, Line 61
The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.
Msg 156, Level 15, State 1, Procedure V_SREG01Individual, Line 65
Incorrect syntax near the keyword 'AND'.
Msg 4147, Level 15, State 1, Procedure V_SREG01Individual, Line 124
The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.
Msg 156, Level 15, State 1, Procedure V_SREG01Individual, Line 128
Incorrect syntax near the keyword 'AND'.

谁能帮我解决啊!

解决方案 »

  1.   

    "*=" or "=*"
    -->
    LEFT OUTER JOIN, RIGHT OUTER JOIN
      

  2.   

    SQL 2005不支持"*=" or "=*"
      

  3.   

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

  4.   

    请使用存储过程 sp_dbcmptlevel 将当前数据库的兼容级别设置为 80 或更低
      

  5.   

    我担心把"*=" 改成LEFT OUTER JOIN之后影响的行数与不改之前不一致
      

  6.   

    EXEC sp_dbcmptlevel '库名', '80';
    GO
      

  7.   

    ALTER DATABASE 兼容级别 (Transact-SQL)将某些数据库行为设置为与指定的 SQL Server 版本兼容。
    以下 ALTER DATABASE 语法是 SQL Server 2008 中新增的语法,它取代了用于设置数据库兼容级别的 sp_dbcmptlevel 过程。语法 ALTER DATABASE database_name 
    SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 } 参数
     
    database_name 
    要修改的数据库的名称。
    COMPATIBILITY_LEVEL { 80 | 90 | 100 }要使数据库与之兼容的 SQL Server 版本。该值必须为下列值之一:80 = SQL Server 2000 
    90 = SQL Server 2005 
    100 = SQL Server 2008  
    备注 对于所有 SQL Server 2008 安装,默认的兼容级别都为 100。除非 model 数据库有更低的兼容级别,否则 SQL Server 2008 中创建的数据库会设置为该级别。将数据库从 SQL Server 的任何早期版本升级到 SQL Server 2008 时,如果数据库的兼容级别不在 80 以下,则该数据库将保留其现有的兼容级别。升级兼容级别低于 80 的数据库会将数据库的兼容级别设置为 80。这既适用于系统数据库,也适用于用户数据库。使用 ALTER DATABASE 可更改数据库的兼容级别。若要查看数据库的当前兼容级别,请查询 sys.databases 目录视图中的 compatibility_level 列。利用兼容级别获得向后兼容
    兼容级别只影响指定数据库的行为,而不影响整个服务器的行为。兼容级别只实现与 SQL Server 的早期版本保持部分向后兼容。通过将兼容级别用作临时性的迁移辅助工具,可解决相关兼容级别设置控制的行为之间存在的版本差异问题。如果现有 SQL Server 应用程序受到 SQL Server 2008 中行为差异的影响,请对该应用程序进行转换,使之能正常运行。然后使用 ALTER DATABASE 将兼容级别更改为 100。数据库的新兼容性设置将在该数据库下次成为当前数据库(无论是在登录时作为默认数据库还是在 USE 语句中指定)时生效。
      

  8.   


    那就一个一个改代码,把
    "*=" or "=*"
    改成
    LEFT OUTER JOIN, RIGHT OUTER JOIN
    这个工作量应该不小,出错率也很高所以从现在起,就应该不用以后版本不支持的写法
      

  9.   

    改了,数据库报错:无效的表明:
    Msg 208, Level 16, State 1, Procedure V_SREG01Individual, Line 17
    Invalid object name 'SREG01ServerRegistrationS'.

      

  10.   

    你的语句改法...
    FROM 
    SREG01ServerRegistrationS r left outer join
    SREG01RegPhoneNumberS p on r.MSTransactionId  = p.MSTransactionId  AND r.ProductPID  *= p.ProductPID  
    WHERE 
    p.PhoneTypeCode = (SELECT MIN(p2.PhoneTypecode) 
    FROM SREG01RegPhoneNumberS p2 
    WHERE p2.MSTransactionId = r.MSTransactionId) 
    AND r.ProductMPCCode <> 'NOPID' 
    and r.ProductPID = 
    (SELECT MIN (r2.ProductPID) 
    FROM SREG01ServerRegistrationS r2 
    WHERE r.MSTransactionId = r2.MSTransactionId 
    AND r.ProductMPCCode = r2.ProductMPCCode)