整理声明的 SQL 变量
Collate declared SQL variable
我一直在查看下面转载的 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
只是不做同样的事情。我只是缺少一些语法吗?不可能吗?
这是正常的。当您创建一个变量时,它采用数据库的默认排序规则。
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);
输出:
╔══════╦══════════════════════════════╗
║ name ║ collation_name ║
╠══════╬══════════════════════════════╣
║ @v1 ║ SQL_Latin1_General_CP1_CI_AS ║
╚══════╩══════════════════════════════╝
变量(不包括 table 变量中的列)不允许定义排序规则,因此没有像这样的语法:
DECLARE @v1 varchar(100) COLLATE Latin1_General_CS_AS = 'ABC' ;
-- Incorrect syntax near the keyword 'COLLATE'.
我一直在查看下面转载的 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
只是不做同样的事情。我只是缺少一些语法吗?不可能吗?
这是正常的。当您创建一个变量时,它采用数据库的默认排序规则。
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);
输出:
╔══════╦══════════════════════════════╗
║ name ║ collation_name ║
╠══════╬══════════════════════════════╣
║ @v1 ║ SQL_Latin1_General_CP1_CI_AS ║
╚══════╩══════════════════════════════╝
变量(不包括 table 变量中的列)不允许定义排序规则,因此没有像这样的语法:
DECLARE @v1 varchar(100) COLLATE Latin1_General_CS_AS = 'ABC' ;
-- Incorrect syntax near the keyword 'COLLATE'.