2

私はこれに対する答えを求めてグーグルをトロールしてきましたが、運がありません。どんな助けでも素晴らしいでしょう!

SQLテーブルtblFeedbackがあります。フィードバックの質問への回答を保存します。質問は別のテーブルtblQuestionsに保持されます。フィードバックフォームの質問はユーザーインターフェイスを介して変更できるため、ユーザーが質問を編集して置換する場合は、質問をtblQuestionsに書き直し、tblFeedbackに回答列を提供します(質問ごとに1つ)。それが理解するのに十分簡単であることを願っています。

そのため、現時点で3つの質問があります。私のtblFeedback列は次のようになります:
FeedbackID
名前
日付
Question_1
Question_2
Question_3

これらの列を削除し、必要に応じて新しい列に置き換えたいと思います。ALTER TABLE tblFeedback DROP COLUMNを使用する方法をたどっていますが、WHEREなどを使用して基準を追加することはできません。 'しかし、COLUMNの後にWHEREを追加すると、エラーが発生します。

私はc#を使用してasp.netアプリ用にこれを書いています。

これに関するどんな助けも本当に本当にありがたいです。落ち着くために散歩に行きます。

4

5 に答える 5

6

DB 設計を再検討してください。質問列を完全に削除し、テーブルを追加します

Question (QuestionID int identity, Deleted datetime, Text text)  
Answer (FeedbackID int FK to Feedback, QuestionID int FK to Question, Text text)

次に、フォーム上の質問を表示または非表示にする基準として Question.Deleted == null を使用します。

于 2010-08-22T13:57:47.323 に答える
4
IF COLUMNPROPERTY(OBJECT_ID('myTable'), 'ColumnID', 'Question_1') IS NOT NULL
    ALTER TABLE tblFeedback DROP COLUMN Question_1

ただし、これによりすべての行が削除されます。たとえば、回答のある行と質問のある行を含めることはできません。

私があなたを正しく理解していれば、質問/回答/フィードバックなどを定義するタイプで0からnの質問/回答/フィードバックを許可する子テーブルとして実装します。

于 2010-08-22T13:54:55.987 に答える
3

この種のものには、EAV (エンティティ属性値) スタイルのデータベース構造の方が適しているかもしれません。

create table Question
(
    Id bigint not null primary key identity(1,1),
    Question nvarchar(max) not null
)

create table Feedback
(
    Id bigint not null primary key identity(1,1),
    Date datetime not null,
    Name nvarchar(512) not null,    
)

create table FeedbackAnswers
(
    Id bigint not null primary key identity(1,1),   
    FeedbackId bigint not null,
    QuestionId bigint not null,
    Answer nvarchar(max) not null
)

質問をまとめて「グループ化」するには、おそらく何か他のものが必要になるでしょう。

ただし、レポートはもう少し複雑になります。

于 2010-08-22T14:04:10.333 に答える
1

sys.columnsフィードバックフォームが変更されるたびに列名に基づいてテーブル構造を本当に変更したい場合は、これに動的SQLを使用してクエリを実行する必要があります。そもそも何らかの理由で保存していると思われる履歴データが削除されるため、これは珍しい要件のようです。

しかし、他の方法では手動で行う必要がある何かを自動化したいだけの場合は...

構文例

DECLARE @dynsql NVARCHAR(4000)

SELECT @dynsql = ISNULL(@dynsql + ',','') + QUOTENAME(name)
 FROM sys.columns WHERE name LIKE 'Question%'
 AND OBJECT_ID=OBJECT_ID('dbo.tblFeedback')

IF(@@ROWCOUNT > 0)
EXEC ('ALTER TABLE dbo.tblFeedback DROP COLUMN ' + @dynsql)
于 2010-08-22T13:55:34.613 に答える