Question

J'ai été chalutait google pour trouver des réponses à cela, mais pas de chance. Toute aide serait génial!

J'ai une table SQL: tblFeedback. Il stocke les réponses aux questions de rétroaction. Les questions sont tenues dans une autre table: tblQuestions. Les questions sur le formulaire de commentaires peuvent être modifiés via une interface utilisateur, par conséquent, lorsque l'utilisateur modifie les questions de les remplace, je réécris les questions à tblQuestions et fournir des colonnes de réponse à tblFeedback (un pour chaque question). L'espoir des thats assez facile à comprendre.

Donc, à la minute où j'ai 3 questions. Mes colonnes tblFeedback ressemblent:
FeedbackID
nom
Date
Question_1
Question_2
Question_3

Je veux supprimer ces colonnes et les remplacer par de nouvelles si nécessaire. Je vais sur le chemin d'aide de la colonne ALTER TABLE tblFeedback DROP ... mais je ne peux pas ajouter des critères à l'aide WHERE ou toute autre chose .. Si je pouvais préciser quelque chose comme « si commence Column_name avec Question_% » ou « si column_id> 3 mais si j'ajoute WHERE après la colonne je reçois des erreurs.

Je vous écris ceci pour une application asp.net en utilisant c #.

Toute aide à ce serait vraiment très apprécié. Im faire une promenade vers le bas calme.

Était-ce utile?

La solution

Vous pourriez être mieux avec une structure de base de données de style EAV (vaue de l'attribut d'entité) pour ce genre de chose.

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
)

Vous aurez probablement besoin de quelque chose d'autre « groupe » les questions ensemble.

Il ne fait de déclaration un peu plus impliqué cependant.

Autres conseils

S'il vous plaît reconsidérer votre conception DB. Déposer des colonnes question entièrement et ajouter des tables

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

utilisez le null de Question.Deleted comme critères vous où pour afficher ou masquer des questions sur votre formulaire.

IF COLUMNPROPERTY(OBJECT_ID('myTable'), 'ColumnID', 'Question_1') IS NOT NULL
    ALTER TABLE tblFeedback DROP COLUMN Question_1

Cependant, cela baissera toutes les lignes. Vous ne pouvez pas avoir des lignes avec réponse et certaines avec des questions par exemple

Si je vous comprends bien, je mettre en œuvre une table enfant pour permettre 0 à n questions / réponses / commentaires avec un type pour définir questions / réponses / commentaires etc.

Vous devez utiliser SQL dynamique pour cette requête et sys.columns si vous voulez vraiment changer la structure de la table en fonction du nom de la colonne à chaque fois que les modifications du formulaire de rétroaction. Cela ne semble une exigence inhabituelle car elle supprime les données historiques que vous stockez probablement pour une raison quelconque, en premier lieu

mais si vous voulez juste pour automatiser quelque chose que vous auriez besoin autrement faire manuellement ...

Exemple de syntaxe

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)

Pour le bénéfice de ceux qui trouvent cette question plus tard, ce genre de chose est possible que la base de l'exécution conditionnelle d'une commande sur les résultats d'une requête (dans ce cas, la vérification d'une colonne ne contient que NULL avant de prendre une action comme la chute la colonne):

IF (SELECT COUNT([my column]) FROM [my table] WHERE [my column] IS NOT NULL) = 0
  PRINT 'remove' ELSE PRINT 'keep';
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top