2010-08-22 2 views
2

Я травля google для ответов на это, но не повезло. Любая помощь будет замечательной!SQL Server, как DROP COLUMN, если условие выполнено?

У меня есть таблица SQL: tblFeedback. В нем хранятся ответы на вопросы обратной связи. Вопросы хранятся в другой таблице: tblQuestions. Вопросы по форме обратной связи могут быть изменены с помощью пользовательского интерфейса, поэтому, когда пользователь редактирует вопросы их замены, я переписываю вопросы в tblQuestions и предоставляю столбцы ответов в tblFeedback (по одному для каждого вопроса). Надеюсь, это достаточно легко понять.

Итак, у меня есть 3 вопроса. Мои tblFeedback столбцы выглядеть следующим образом:
FeedbackID
Имя
Дата
Question_1
Question_2
Question_3

Я хочу, чтобы удалить эти колонки, и заменить их новыми, когда это необходимо. Я иду по пути использования ALTER TABLE tblFeedback DROP COLUMN ... но я не могу добавить какие-либо критерии, используя WHERE или что-то еще. Если бы я мог указать что-то вроде «если имя_столбца начинается с Question_%» или «if column_ID» 3 ', но если я добавлю WHERE после COLUMN, я получу ошибки.

Я пишу это для приложения asp.net, используя C#.

Любая помощь с этим будет действительно оценена по достоинству. Я собираюсь погулять, чтобы успокоиться.

+0

Вы не можете включить WHERE или любой другой DML в команду ALTER TABLE. –

+0

Вы все были здоровы, но ответы были настолько запутанными, что я фактически оставил этот проект на 2 дня! Я вернусь к нему сейчас, и я отчаянно пытаюсь решить, как наилучшим образом двигаться вперед. Я думаю, что я должен создать крайнюю таблицу, предложенную Дэниелом ниже. Я, вероятно, вернусь с большим количеством вопросов в то время. Спасибо всем! – Frank

ответ

3

Возможно, вам будет лучше с структурой базы данных стиля EAV (entity attribute vaue) для такого рода вещей.

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 
) 

Возможно, вам понадобится что-то еще, чтобы «сгруппировать» вопросы вместе.

Это делает сообщение немного более привлекательным, хотя.

+0

+1 Я исправил форматирование кода. Выберите код для форматирования и щелкните по значку '1010', чтобы отформатировать его как код. –

+0

Хороший ответ, но не очень EAV, хотя, позволяя от 0 до n детей фиксированного типа (aka ответы и т. Д.) ... – gbn

4

Однако это приведет к потере всех строк: у вас не может быть строк с ответом, а у некоторых - с вопросом.

Если я вас правильно понял, я бы реализовать в качестве дочерней таблицы, чтобы 0 до п вопрос/ответ/обратная связь с типом определить вопрос/ответ/обратная связь и т.д.

1

Вам нужно будет использовать динамический SQL для этого и запросите sys.columns, если вы действительно хотите изменить структуру таблицы на основе имени столбца каждый раз, когда изменяется форма обратной связи. Это действительно кажется необычным требование, поскольку это приведет к удалению исторических данных, которые, предположительно, хранящие по какой-то причине в первую очередь

, но если вы просто хотите автоматизировать то, что в противном случае вам нужно будет делать вручную ...

Пример Синтаксис

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) 
+0

... но пожалуйста, пожалуйста, пожалуйста, пожалуйста, не удаляйте или не обновляйте sys.columns или друзей - система не должна позволять вам, но если она была настроена так, чтобы это НЕ СДЕЛАЛО! –

+0

@Will - Может быть, я должен привести пример, чтобы быть ясным! –

+0

Может быть, лучше всего, Мартин - я просто представлю OP, играя с sys.columns и имея _fun _... ахм. –

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, как вы критерии везде, чтобы показать или скрыть вопросы на форме.

0

В интересах тех, кто находит этот вопрос позже, это возможно в качестве основы условного выполнения команды по результатам запроса (в этом случае проверка столбца содержит только NULL перед выполнением действия падение колонны):

IF (SELECT COUNT([my column]) FROM [my table] WHERE [my column] IS NOT NULL) = 0 
    PRINT 'remove' ELSE PRINT 'keep'; 
Смежные вопросы