【问题标题】:MSSQL collation conflict stored procedureMSSQL 排序规则冲突存储过程
【发布时间】:2017-07-06 08:44:06
【问题描述】:

我的查询有错误

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_100_CS_AS" in the equal to operation.

我知道我可以用这个 SQL 语句解决这个错误:

ALTER TABLE [TableA]
ALTER COLUMN [ColumnX]
VARCHAR(20) COLLATE SQL_Latin1_General_CP1_CI_AS; 

我遇到的问题是我有一个存储过程,我在其中添加了 SQL 语句来更改列,然后查询我收到错误,但更改语句似乎没有被执行。存储过程中的代码如下:

ALTER TABLE [TableA]
ALTER COLUMN [ColumnX]
VARCHAR(20) COLLATE SQL_Latin1_General_CP1_CI_AS; 

INSERT INTO [TableC] 
([ColumT] )
SELECT 
 [TableB].[Account]
FROM [TableA], [TableB]
WHERE  
 Left(TableA.[ColumnX],1)=TableB.[ColumnY];

如果我已经独立运行了 ALTER 和 INSERT SQL 代码,那么 INSERT 语句就可以工作。如果我在存储过程中一起运行它们,则会出现错误。

为什么存储过程没有运行第一个 ALTER SQL 语句?

【问题讨论】:

  • 你知道你可以在 Join 中添加排序规则吗? (见stackoverflow.com/questions/1607560/…
  • 试一试...将GO 放在 ALTER 语句之后并尝试。
  • Etsa,更愿意使用 alter 来消除使用相同字段的后续查询中的类似问题。 Prabhat,我尝试使用 ALTER PROCEDURE 命令添加 GO,但这会产生错误('SQL_Latin1_General_CP1_CI_AS' 附近的语法不正确)
  • @Etsa 奇怪,我试图复制你的场景。它工作正常......
  • Prabhat,你把 GO 放在哪里了?

标签: sql-server stored-procedures


【解决方案1】:

您可以通过在存储过程(即独立)范围之外执行 alter 语句来更改表以具有正确的排序规则。只需执行一次。

在存储过程中这样做不是正确的地方。您将在每次执行存储过程时更改此表列,这不是必需的。如果您后来决定必须以另一种方式更改此列,也可能会出现问题;您还必须记住并更改存储过程。这是不可取的。

或者,您指定 SQL 语句中所需的排序规则

INSERT INTO [TableC] 
    ([ColumT] )
SELECT 
    [TableB].[Account]
FROM 
    [TableA] 
    INNER JOIN [TableB] ON
        LEFT(TableA.[ColumnX],1) COLLATE SQL_Latin1_General_CP1_CI_AS = TableB.[ColumnY];

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2010-11-30
    • 2011-04-17
    • 2012-11-20
    • 1970-01-01
    • 2010-10-07
    • 2012-01-21
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多