Сортировка объявленной переменной SQL

Я смотрел этот код, воспроизведенный ниже, который ищет символы, отличные от 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

просто не делает то же самое. Мне просто не хватает синтаксиса? Это невозможно?


person Michael    schedule 04.12.2015    source источник


Ответы (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'.
person Lukasz Szozda    schedule 05.12.2015
comment
Что касается исключения, которое вы упомянули: переменные таблицы ... Когда дело доходит до table_types, когда я передаю данные в table_type с определенным сопоставлением, будут ли мои входные данные переданы в определенное сопоставление столбца типа таблицы? - person ColinMac; 27.11.2019