【问题标题】:Collate declared SQL variable整理声明的 SQL 变量
【发布时间】:2016-03-09 21:08:00
【问题描述】:

我一直在查看下面转载的 this code,,它寻找非 ASCII 字符...

select line,
  patindex('%[^ !-~]%' COLLATE Latin1_General_BIN, Line) as [Position],
  substring(Line, patindex('%[^ !-~]%' COLLATE Latin1_General_BIN, Line), 1) as [InvalidCharacter],
  ascii(substring(line, patindex('%[^ !-~]%' COLLATE Latin1_General_BIN, Line), 1)) as [ASCIICode]
from staging.APARMRE1
where patindex('%[^ !-~]%' COLLATE Latin1_General_BIN, Line) > 0

我想为'%[^ !-~]%' COLLATE Latin1_General_BIN 声明一个变量而不是每次都写出来,但

declare @regex varchar(20) = '%[^ !-~]%' COLLATE Latin1_General_BIN;

select line,
  patindex(@regex, Line) as [Position],
  substring(Line, patindex(@regex, Line), 1) as [InvalidCharacter],
  ascii(substring(line, patindex(@regex, Line), 1)) as [ASCIICode]
from staging.APARMRE1
where patindex(@regex, Line) > 0

只是不做同样的事情。我只是缺少一些语法吗?不可能吗?

【问题讨论】:

    标签: sql sql-server tsql collate


    【解决方案1】:

    这很正常。创建变量时,它采用数据库的默认排序规则。

    DECLARE @regex varchar(20) = '%[^ !-~]%' COLLATE Latin1_General_BIN;
    

    带有COLLATE Latin1_General_BIN 的字符串被隐式转换为带有数据库默认排序规则的字符串。


    例如数据库是Case-Insensitive。我使用您的语法创建区分大小写的语法并检查它的元数据:
    DECLARE @v1 varchar(100) = 'ABC' COLLATE Latin1_General_CS_AS;
    
    SELECT name, collation_name
    FROM sys.dm_exec_describe_first_result_set(
        N'SELECT @v1 AS [@v1]', N'@v1 varchar(100)', 0);
    

    LiveDemo

    输出:

    ╔══════╦══════════════════════════════╗
    ║ 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'.
    

    【讨论】:

    • 关于你提到的异常:表变量......当涉及到table_types时,当我将数据传递到具有特定排序规则的table_type时,它会将我的输入数据转换为表类型列的定义整理?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2015-05-04
    • 1970-01-01
    • 2017-04-07
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多