3

簡単な質問であることを願っています。これのための作業コードが見つからず、少し途方に暮れています。

SQL Server 2005 で古いデータベースを使用しています。これには動的なアンケート (実際には 1000 の、実際には ... 長い話) があり、各質問には回答を smallint または ntext として格納できます。

現在の「回答」表は次のとおりです。

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

(はい、ntext非推奨であることはわかっています。古いテーブルです。)

このテーブルには現在 300,000 を超えるレコードがあり、非常に大きくなっています。そこで、データをより効率的に格納する方法を探していて、すべてを 1 つの sql_variant フィールドに移動して少し実験することにしました (現在、各行は 2 つの回答列の両方ではなく、1 つのみにデータを持つことができます)。

そこで、次の名前の別のテーブルを作成しました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で何かをしなければならなかったので、数か月が経ちました)。検索中。助けてください。:)

編集:試行錯誤の結果、答えが見つかりました...

答えは最良のものではなかったかもしれません (そして、いくつかの不必要なフープをジャンプするかもしれません) が、それは 1 回限りのクエリであり、機能します。:)

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 として定義された列に誤って文字列値を指定したときに、同様のエラーに直面しました。挿入ステートメントの値とテーブル フィールドを再配置してください。

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 に答える