我有一个快速的问题。尚未找到适用的代码,我有点茫然。

我正在使用SQL Server 2005上的旧数据库。它有一个动态调查表(或一千个,实际上是个长话),每个问题都可以将答案存储为smallint或ntext。

当前的“答案”表如下:

AnswerID (PK, int, not null)
EvalID (int, null)
QuestionID (int, null)
NumericAnswer (smallint, null)
TextAnswer (ntext, null)


(是的,我知道已弃用ntext。这是一张旧桌子。)

现在该表中有超过300,000条记录,并且确实越来越大。因此,我正在寻找更有效的数据存储方式,并决定进行一些实验,将所有内容移至单个sql_variant字段(当前,每一行只能在两个答案列之一中拥有数据,而不能在两个答案列中都有)。

所以我做了另一个表,叫做AnswersTest

AnswerID (PK, int, not null)
EvalID (int, null)
QuestionID (int, null)
AnswerGiven (sql_variant, null)


...并且我现在正尝试从AnswersAnswersTest的所有现有数据,最好按其原始顺序...因此我正在运行插入查询,但它不起作用。我已经尝试了以下两种方法:

INSERT INTO AnswersTest (EvalID, QuestionID, AnswerGiven)
SELECT EvalID, QuestionID, ISNULL(NumericAnswer,TextAnswer) AS AnswerGiven FROM Answers ORDER BY AnswerID


...和

INSERT INTO AnswersTest (EvalID, QuestionID, AnswerGiven)
SELECT EvalID, QuestionID, CONVERT(ntext,CASE WHEN NumericAnswer IS NULL THEN TextAnswer ELSE NumericAnswer END) AS AnswerGiven FROM Answers ORDER BY AnswerID


在两种情况下,我都会得到以下结果:
Operand type clash: ntext is incompatible with smallint

我知道必须对此有一个简单的答案...我只是在画一个空白(距离我不得不对TSQL做很多事情已经过去了几个月时间),我无法找到一个可行的答案搜索。请帮忙。 :)

编辑:通过反复试验找到答案...

答案可能不是最好的答案(并且可能会跳过一些不必要的麻烦),但这是一次查询,并且可以奏效。 :)

INSERT INTO AnswersTest (EvalID, QuestionID, AnswerGiven)
SELECT EvalID, QuestionID, CASE WHEN CONVERT(sql_variant,NumericAnswer) IS NULL THEN CONVERT(sql_variant,CONVERT(varchar(8000),TextAnswer)) ELSE CONVERT(sql_variant,NumericAnswer) END AS AnswerGiven FROM Answers ORDER BY AnswerID


(注意:我尝试了varchar(max),但这是不允许的。虽然答案没有那么长,但是...在这些调查中没有人写论文...所以我只是将其更改为varchar(8000),工作)。

感谢您的阅读,很抱歉占用您的时间! :)

最佳答案

当我不小心将字符串值提供给定义为int的列时,遇到了类似错误。
请在insert语句中重新排列值和Table字段
对于前

Insert into Table (int,string) values (string,int)


将无法正常工作并产生上述错误。因此,请按照各自的方式重新安排。

 Insert into Table (int,string) values (int,string)

关于sql-server - SQL Server 2005:插入查询返回操作数类型冲突:ntext与smallint不兼容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17709246/

10-13 06:07