【发布时间】:2015-01-25 02:12:04
【问题描述】:
我正在处理一个表,其中将一堆任意设置存储为VARCHAR(255) 值。我负责处理的特定任务是一个需要递增并返回给调用者的序列号。 (再次注意,序列“编号”存储为VARCHAR,这是我无法控制的)。
因为它是一个序列号,我真的不想在单独的步骤中选择和更新。当我过去用实际的数字字段处理这类事情时,我的方法类似于
UPDATE TABLE SET @SEQ_NUM = VALUE = VALUE + 1
它会增加值并在一个膨胀的过程中为我提供更新的值。我想在这种情况下,我会尝试使用演员表进行相同的基本操作:
DECLARE @SEQ_NUM VARCHAR(255)
UPDATE SOME_TABLE
SET @SEQ_NUM = VALUE = CAST((CAST(VALUE AS INT) + 1) AS VARCHAR)
WHERE NAME = 'SOME_NAME'
只要我不尝试将结果分配给变量,实际更新就可以正常工作;一旦我这样做,我就会收到以下错误:
Msg 549, Level 16, State 1, Line 4 排序规则 接收变量的“SQL_Latin1_General_CP1_CI_AS”不等于 “VALUE”列的排序规则“Latin1_General_BIN”。
我明白这意味着什么,但我不明白为什么会发生这种情况,或者进一步说,如何解决这个问题。
除了修复特定错误之外,我欢迎提供有关增加字符序列“数字”的替代方法的建议。
【问题讨论】:
-
你为什么还要维护自己的序列号?它充满了并发等问题。因为设计这个的人并不认为你会在这里打一场败仗。
-
您可以通过使用
COLLATE关键字来解决此问题。 -
@SeanLange,相信我,我知道。幸运的是,这个特殊的用例不会经常使用,但它仍然是一个巨大的 PITA。
-
@GordonLinoff--究竟如何?我尝试对计算值强制 COLLATE,如下所示:'SET SEQ_NUM = VALUE = CAST((CAST(VALUE AS INT) + 1) AS VARCHAR) COLLATE SQL_Latin1_General_CP1_CI_AS',但收到相同的错误。我不知道有一种方法可以在变量本身上设置 COLLATE 值(并不是说我不知道某事意味着什么)。
标签: sql sql-server sql-server-2008 collation