MSSQL排序规则冲突存储过程

时间:2017-07-06 08:44:06

标签: sql-server stored-procedures

我的查询错误,如

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 statement似乎不是执行。存储过程中的代码如下:

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语句?

1 个答案:

答案 0 :(得分: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];