【问题标题】:Create column listing ascii control keys创建列列表 ascii 控制键
【发布时间】:2021-10-27 13:46:38
【问题描述】:

我需要创建一个包含 ascii 控制键的表(代码范围在 0 到 31 之间)。

我的第一次尝试:

CREATE TABLE control_characters(
    n int,
    [character] varchar(1)
);

WITH cte AS (
    SELECT 0 AS n, CAST(0 AS varchar(1)) AS c

    UNION ALL

    SELECT n+1 AS n, CAST(n+1 AS varchar(1)) AS c
    FROM cte
    WHERE n<=30
)
INSERT INTO control_characters(n, [character])
SELECT n,c FROM cte;

SELECT * FROM control_characters;

SELECT CAST(cc.[character] AS int) AS pb, s.*
FROM file_extract_staging s
CROSS JOIN control_characters cc
WHERE CHARINDEX(cc.[character], s.absolute_path_unique) != 0

【问题讨论】:

  • 当您拥有varchar(1) 时,您如何期望 10 及以上的数字适合它? 10 有 2 个字符,'1''0'。或者你真的想要CHAR(n),而不是varchar,其值为n(例如'10')?
  • 我的最终目标是检测包含文件系统绝对文件路径的列中的控制字符
  • CHARINDEX 的第一个参数可以是 int 吗?我不想在绝对文件系统路径中检测“3”,我想用 ascii 代码 3 检测特殊字符。
  • "CHARINDEX 的第一个参数可以是 int" 可以,但是会隐式转换为字符表达式。所以100 将被隐式转换为'100'
  • 这就是我不想要的

标签: sql sql-server ascii charindex control-characters


【解决方案1】:

你应该使用 CHAR 函数。

此外,使用 char(1) 代替 varchar(1) 效率更高。

CREATE TABLE control_characters(
    n int,
    [character] char(1)
);
GO
WITH cte AS (
    SELECT 0 AS n, CHAR(0) AS c

    UNION ALL

    SELECT n+1 AS n, CHAR(n+1) AS c
    FROM cte
    WHERE n<=30
)
INSERT INTO control_characters(n, [character])
SELECT n,c FROM cte;
GO
SELECT * FROM control_characters;

【讨论】:

  • 实际上,它似乎生成了一个控制字符列表。非常感谢!
  • 并且 CHARINDEX 函数可以使用 CHAR 作为第一个参数。非常好,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多