【问题标题】:Cannot resolve the collation conflict between "Latin1_General_CI_AI" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation无法解决等于操作中“Latin1_General_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突
【发布时间】:2013-08-06 10:36:26
【问题描述】:

我正在尝试在 SQL Server 2008R2 中创建一个过程,但它显示此错误

无法解决“Latin1_General_CI_AI”之间的排序规则冲突 和“SQL_Latin1_General_CP1_CI_AS”中的等于操作。

我创建的程序是

CREATE Procedure Ps_Quiz_OnlineTest_QuestionsWithOptions_Get --'Ques1'
  @Ques Varchar(8000)
As        
Begin

  Select 
    A.QuestionId, 
    A.QsnDesc, 
    A.CorrectOption, 
    B.OptionValue, 
    A.Marks,
    (
      Select QsnName 
      From Quiz_tblQsnsLimitMaster
      Where QsnId = @Ques) QuesPaper,
    (
      Select Durationoftest 
      From Quiz_tblQsnsLimitMaster
      Where QsnId = @Ques) QuesPaper
    From 
      Quiz_tblQsnCreationMaster A, 
      Quiz_tblQsnCreationDetail B        
    Where 
      A.QuestionId = B.QuestionId
      And A.QuestionId In (
        Select QuestionIds 
        From FN_Question_Answers_Quiz(@Ques))
      And B.QuestionId In (
        Select QuestionIds 
        From FN_Question_Answers_Quiz(@Ques))  
    Order By 
      A.QuestionId, 
      B.OptionOrder 

End    

我尝试使用不同的排序规则来整理表格,但没有奏效。 我该如何解决这个问题。

【问题讨论】:

  • 在表与其他排序规则的比较中添加COLLATE 语句。如果您从 SSMS 运行,可以双击结果窗口中的错误,它会显示它发生在哪一行:)
  • 第 6 行显示错误,即 Select A.QuestionId、A.QsnDesc、A.CorrectOption、B.OptionValue、A.Marks,如何在此处添加 COLLATE 语句?
  • Quiz_tblQsnsLimitMaster.QsnId 是什么数据类型?
  • @Hanumendra 它将在某处进行比较操作。 A.QuestionIdB.QuestionId 的数据类型是 varchar 吗?
  • @Ozren Tkalčec Krznarić,数据类型为 Varchar

标签: sql-server sql-server-2008-r2


【解决方案1】:

这可能会有所帮助,像这样改变你的 where 条件

Where A.QuestionId COLLATE DATABASE_DEFAULT = B.QuestionId  COLLATE DATABASE_DEFAULT

【讨论】:

    【解决方案2】:

    由于您提到每个表中的 QuestionID 都是 varchar,因此可能是它们之间的比较。所以猜测一下,尝试换行:

    Where A.QuestionId = B.QuestionId  And
    

    致以下:

    Where A.QuestionId = B.QuestionId COLLATE SQL_Latin1_General_CP1_CI_AS And
    

    如果您对表使用正确的连接语法,我会更喜欢它 - 但那是另一天;-)

    【讨论】:

    • 我试过了,但它不起作用,它显示同样的错误
    【解决方案3】:

    尝试使用这个, 其中字段名 COLLATE DATABASE_DEFAULT = 第二个字段名 COLLATE DATABASE_DEFAULT

    这是有效的

    【讨论】:

      【解决方案4】:

      在连接具有不同排序规则的表时,只需使用以下语法,

      where  A.QuestionId collate SQL_Latin1_General_CP1_CI__AS = B.QuestionId collate
      SQL_Latin1_General1_General_CP1_CI_AS
      

      【讨论】:

        【解决方案5】:

        要克服这个问题,请使用以下代码:

        SELECT NAME
        FROM sys.objects
        WHERE NAME COLLATE DATABASE_DEFAULT NOT IN (SELECT TYPE  
        FROM sys.objects)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-20
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多