3

我有一个我希望是一个快速的问题。还没有找到工作代码,我有点茫然。

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

...我现在正在尝试从 to 获取所有现有数据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),这样就奏效了)。

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

4

2 回答 2

1

当我不小心将字符串值赋予定义为 int 的列时,遇到了类似的错误。请重新排列插入语句中的值和表字段 For ex

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

将不起作用并产生如上所述的错误。所以以各自的方式重新安排。

 Insert into Table (int,string) values (int,string)
于 2016-02-26T05:42:14.407 回答
0

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

于 2013-07-18T06:21:48.273 回答