如何更改TSQL上列的数据类型?特别是当数据类型为VARCHAR到INT时?

如何更改TSQL上列的数据类型?特别是当数据类型为VARCHAR到INT时?,tsql,Tsql,我有一个表格,它有三列,学校名称,学校编号,总注册人数。但是,total_登记作为VARCHAR列数据类型加载。因此,该列具有额外的空格和字符 情景:学校A有621个注册,但字段加载了一个额外的空白到631个,下划线代表空白字段,当我尝试总结这一点时,它不会因为它是VARCHAR,所以我把它投成int来总结它:我不是这样设计这个表的人,该字段在开始时应该是数字或INT,但它失败了 解决方案:我无法重建此表,是否有办法通过T-SQL更改数据类型并删除奇怪的字符和额外的空格,以便使用求和函数对列进行

我有一个表格,它有三列,学校名称,学校编号,总注册人数。但是,total_登记作为VARCHAR列数据类型加载。因此,该列具有额外的空格和字符

情景:学校A有621个注册,但字段加载了一个额外的空白到631个,下划线代表空白字段,当我尝试总结这一点时,它不会因为它是VARCHAR,所以我把它投成int来总结它:我不是这样设计这个表的人,该字段在开始时应该是数字或INT,但它失败了

解决方案:我无法重建此表,是否有办法通过T-SQL更改数据类型并删除奇怪的字符和额外的空格,以便使用求和函数对列进行计数

1如果您可以确定所需的数字位于字符串的最左侧,并且您有多个非数字字符,则可以使用:

DROP TABLE IF EXISTS #source;
CREATE TABLE #source(total_Enrollments VARCHAR(100));
INSERT INTO #source VALUES ('101'), ('102_'), ('103 ');
INSERT INTO #source VALUES ('200' + CHAR(9)), ('201' + CHAR(10)), ('202' + CHAR(13));
INSERT INTO #source VALUES (CHAR(9) + '300'), (CHAR(10) + '301'), (CHAR(13) + '303');

SELECT
    total_Enrollments =
    CASE WHEN PATINDEX('%[^0-9]%', total_Enrollments) = 0
         THEN CAST(total_Enrollments AS INT)
         ELSE CAST(LEFT(total_Enrollments, PATINDEX('%[^0-9]%', total_Enrollments ) - 1) AS INT) END
  , pos  = PATINDEX('%[^0-9]%', total_Enrollments)
  , orig = total_Enrollments
FROM #source
PATINDEX“[^0-9]%”使用正则表达式,其中%[^0-9]%查找0到9之间范围内未由“^”表示的任何字符的第一个位置。不幸的是,REPLACE函数不能处理正则表达式来替换多个位置的非数字字符

2如果您必须处理CHAR0,您可以使用下面的子选择中的REPLACE函数替换它

DROP TABLE IF EXISTS #source;
CREATE TABLE #source(total_Enrollments VARCHAR(100));
INSERT INTO #source VALUES (CHAR(0) + '400' + CHAR(9));

SELECT
    total_Enrollments =
    CASE WHEN PATINDEX('%[^0-9]%', total_Enrollments) = 0
         THEN CAST(total_Enrollments AS INT)
         ELSE CAST(LEFT(total_Enrollments, PATINDEX('%[^0-9]%', total_Enrollments ) - 1) AS INT) END
  , pos  = PATINDEX('%[^0-9]%', total_Enrollments)
  , orig = total_Enrollments
FROM (SELECT total_Enrollments = REPLACE(total_Enrollments , CHAR(0), '') FROM #source) AS sub
请注意,REPLACE仅在CHAR10出现在字符串开头时才查找并替换它。如果发生在任何其他位置,则必须使用其他排序规则

选择total_Enrollments=ReplaceTall_Enrollments整理SQL拉丁语1_General_CP1_CI_AS,CHAR0, 来源


您必须尝试更新表

UPDATE <your_table>
SET total_Enrollments = REPLACE(total_Enrollments , CHAR(0), '')
WHERE CHARINDEX(CHAR(0), total_Enrollments ) > 0;
SELECT CONVERT(INT, REPLACE(total_Enrollments , CHAR(0), ''))
FROM <your_table>;
但是,您还需要修复将这些坏数据放入表中的任何问题

UPDATE <your_table>
SET total_Enrollments = REPLACE(total_Enrollments , CHAR(0), '')
WHERE CHARINDEX(CHAR(0), total_Enrollments ) > 0;
SELECT CONVERT(INT, REPLACE(total_Enrollments , CHAR(0), ''))
FROM <your_table>;

数字不包含换行符。在更改数据类型之前,需要清除数据。函数try\u cast尝试强制转换varchar,如果失败,将不会返回错误,而是返回空值。当然,您可以在try_cast之前修剪列,以便首先删除前面或末尾的空格。您的列应该只包含int数据,还是也包含数字数据?例如,像“1.0”这样的值不能直接转换为int。请注意,它有一个可选语法来删除特定集合中的字符,例如,将@WhiteSpace声明为VarChar10=Char 9+Char 10+Char 13+Char 32。。。修剪MyColumn中的@WhiteSpace。。。删除制表符、换行符、回车符和空格。添加一个新的可为null的int列。用try_cast的结果填充它。然后,您可以选择如何处理失败的值-修复或删除。准备就绪后,删除旧列并将新的旧列名重命名为旧列名。注意:对于可能依赖于旧列的内容,请务必小心。我非常感谢您1教了我一些新的内容,2完全修复了我表中的该列。这一切都很顺利,我希望我能捐钱给你,让你花时间帮助一个完全陌生的人,我只知道你刚刚帮我们避免了一个相当大的耽搁,我真是太感谢你了。