这是正常的。创建变量时,它将采用数据库的默认排序规则。
DECLARE @regex varchar(20) = '%[^ !-~]%' COLLATE Latin1_General_BIN;
您的字符串with
COLLATE Latin1_General_BIN被 隐式转换 为数据库默认排序规则的字符串。
例如数据库是
Case-Insensitive。我使用您的语法来创建区分大小写的语法并检查其元数据:
DECLARE @v1 varchar(100) = 'ABC' COLLATE Latin1_General_CS_AS;SELECt name, collation_nameFROM sys.dm_exec_describe_first_result_set( N'SELECT @v1 AS [@v1]', N'@v1 varchar(100)', 0);
**[LiveDemo
](https://data.stackexchange.com/stackoverflow/query/403728)**
输出:
╔══════╦══════════════════════════════╗║ name ║ collation_name ║╠══════╬══════════════════════════════╣║ @v1 ║ SQL_Latin1_General_CP1_CI_AS ║╚══════╩══════════════════════════════╝
变量(表变量中的列除外)不允许定义排序规则,因此没有类似以下的语法:
DECLARE @v1 varchar(100) COLLATE Latin1_General_CS_AS = 'ABC' ;-- Incorrect syntax near the keyword 'COLLATE'.



