如何将文本列转换为 MS SQL Express 中的整数列?
Posted
技术标签:
【中文标题】如何将文本列转换为 MS SQL Express 中的整数列?【英文标题】:How to cast a text column into integer column in MS SQL Express? 【发布时间】:2021-02-17 14:09:38 【问题描述】:我正在使用 Microsoft SQL Express 和 SQL Server Management Studio。
我正在按照教程从头开始创建一个小表,并按照以下代码输入一些值。本教程正在教授如何正确转换列,如果错误地首先声明它。
CREATE TABLE transactions(
transaction_date date,
amount integer,
fee text
);
SELECT * FROM transactions;
INSERT INTO transactions (transaction_date, amount, fee)
VALUES ('2018-09-24', 5454, '30');
“费用”列错误地创建为文本。我正在尝试在使用以下代码时将此列类型转换为整数。但这给出了以下错误。有什么建议吗?
SELECT transaction_date, amount + CAST (fee AS integer) AS net_amount
FROM transactions;
Explicit conversion from data type text to int is not allowed.
【问题讨论】:
你为什么首先使用text
?它已被弃用 16 年。
此外,如果您正在以字符串类型的数据类型存储数据,那么您根据定义声明您不想对所述数据执行聚合或数学运算。您在这里有 2 个设计缺陷: 1. 您使用的数据类型 (text
) 在 16 年前就应该停止使用。 2. 您正在存储您希望将其视为字符串类型数据类型中的数值的数值数据。修复您的设计,从数字数据类型开始。
@Larnu, :) 我刚开始学习 SQL。教程是这样说的……那么我猜我的教程有误。无论如何,假设它是一个字符串列,关于如何避免错误的任何建议?
为什么要使用字符串类型的数据类型来存储“费用”?正如我所说,如果你想对一个值执行数学运算,那么不要将它存储为字符串类型的值;使用int
、decimal
或numeric
开始。修复您的设计,问题不存在。
另外,如果您正在关注的本教程真的告诉您使用text
存储“费用”,那么我建议您现在停止关注;由于很多原因,这绝对是一个糟糕的建议。找到一个更好的。教程应该告诉您将货币值存储在字符串数据类型中(或更糟的是text
),只有一个原因;展示一个想法的灾难性。
【参考方案1】:
错误在这里告诉你问题;您不能显式(或隐式)将text
值转换/强制转换为int
。 text
已被弃用 16 年,因此您应该不使用它。早在 2005 年,它就被 varchar(MAX)
取代(以及 nvarchar(MAX)
代表 ntext
和 varbinary(MAX)
代表 image
)。
相反,您需要先将该值转换为varchar
,然后再转换为int
。我还建议对后者使用 TRY_CONVERT
,因为像 '3.0'
这样的值将无法转换:
SELECT TRY_CONVERT(int,CONVERT(varchar(MAX),fee))
FROM dbo.transactions;
当然,你真正应该做的是修桌子:
ALTER TABLE dbo.transactions ADD TextFee varchar(MAX) NULL; --To retain any data that couldn't be converted
GO
UPDATE dbo.transactions
SET fee = TRY_CONVERT(int,CONVERT(varchar(MAX),fee)),
TextFee = fee;
GO
ALTER TABLE dbo.transactions ALTER COLUMN fee int;
【讨论】:
谢谢。感谢您花时间解释和指导。以上是关于如何将文本列转换为 MS SQL Express 中的整数列?的主要内容,如果未能解决你的问题,请参考以下文章
在 MS Access 中使用 SQL Server Express 引擎
将 SQL Server 代码转换为 MS Access SQL 代码 - DISTINCT 问题 [重复]