簡単な質問であることを願っています。これのための作業コードが見つからず、少し途方に暮れています。
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)
、うまくいきました)。
お読みいただきありがとうございます。お時間を割いて申し訳ありません。:)