Sql server 如何在MS SQL Express中将文本列强制转换为整数列?

Sql server 如何在MS SQL Express中将文本列强制转换为整数列?,sql-server,sql-server-express,Sql Server,Sql Server Express,我正在使用Microsoft SQL Express和SQL Server Management Studio 我按照教程从头开始创建一个小表,并按照下面的代码输入一些值。本教程将教授如何在列一开始被错误声明时正确地强制转换列 CREATE TABLE transactions( transaction_date date, amount integer, fee text ); SELECT * FROM transactions; INSERT INTO transactions (tr

我正在使用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
值转换/强制转换为
int
text
已经被弃用了16年,因此您应该不要使用它。早在2005年,它就被
varchar(MAX)
取代(对于
ntext
varbinary(MAX)
对于
image
,它还被
nvarchar(MAX)
取代)

相反,您需要先将值转换为
varchar
,然后再转换为
int
。我还建议对后者使用
TRY\u CONVERT
,因为像
'3.0'
这样的值将无法转换:

选择TRY\u CONVERT(int、CONVERT(varchar(MAX)、fee))
来自dbo.transactions;
当然,你真正应该做的是修理桌子:

ALTER TABLE dbo.transactions ADD TextFee varchar(MAX)NULL--保留任何无法转换的数据
去
更新dbo.transactions
设置费用=尝试转换(int,CONVERT(varchar(MAX),fee)),
TextFee=费用;
去
ALTER TABLE dbo.transactions ALTER COLUMN fee int;

首先为什么要使用
文本
?它已经被弃用了16年。另外,如果您是以字符串类型的数据类型存储数据,则根据定义,您表示不希望对所述数据执行聚合或数学运算。这里有两个设计缺陷:1。您正在使用的数据类型(
text
)本应在16年前停止使用。2.您正在存储要像字符串类型数据类型中的数值一样处理的数值数据。修复您的设计,首先使用数字数据类型。@Larnu,:)我刚开始学习SQL。教程上是这么说的……我猜我的教程错了。在任何情况下,假设它是一个字符串列,有没有关于如何避免错误的建议?首先为什么要使用字符串类型的数据类型来存储“费用”?正如我所说,如果您想对一个值执行数学运算,那么不要将其存储为字符串类型的值;首先使用
int
decimal
numeric
。修复您的设计,问题就不存在了。另外,如果您正在学习的本教程真的告诉您使用
文本
存储“费用”,那么我建议您现在停止学习;这绝对是一个糟糕的建议,原因太多了。找一个更好的。教程应该告诉您将货币值存储在字符串数据类型(或者更糟的是
text
)中的原因只有一个;来证明这是一个多么糟糕的主意。谢谢。感谢您花时间解释和指导。