SQL Server 2005:插入查询返回操作数类型冲突:ntext与smallint不兼容

时间:2013-07-17 20:07:34

标签: sql-server tsql

我有我希望的快速问题。没有为此找到工作代码,我有点不知所措。

我正在使用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)

...我现在正尝试将所有现有数据从Answers传递到AnswersTest,最好是按照原始顺序...所以我正在运行插入查询,并且它不起作用。我尝试过以下两种方法:

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),但这是不允许的。答案并不那么长,但是......没有人在这些调查中写论文......所以我只是将其改为{ {1}},这有效。)

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

2 个答案:

答案 0 :(得分:1)

当我意外地将字符串值赋予定义为int的列时,

面临类似的错误。 请重新排列insert语句中的值和Table字段 对于前

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

将无效并产生上述错误。所以请各自重新安排。

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

答案 1 :(得分:0)

这个link描述了ntext和nvarchar(max)之间的区别。是否提到ntext已被弃用。它还讨论了存储在表中的nvarchar(max),使查询更快。您可能想尝试使用numericanswer和textanswer的单独字段的变体,并从性能角度查看它从何处获取。