2

我一直在用谷歌搜索这个问题的答案,但没有运气。任何帮助都会很棒!

我有一个 SQL 表:tblFeedback。它存储反馈问题的答案。问题保存在不同的表中:tblQuestions。反馈表上的问题可以通过用户界面进行更改,因此当用户编辑替换它们的问题时,我将问题重写为 tblQuestions 并在 tblFeedback 中提供答案列(每个问题一个)。希望这很容易理解。

所以此刻我有3个问题。我的 tblFeedback 列看起来像:
FeedbackID
Name
Date
Question_1
Question_2
Question_3

我想删除这些列并在必要时将它们替换为新列。我正在使用 ALTER TABLE tblFeedback DROP COLUMN 的路径......但我不能使用 WHERE 或其他任何东西添加任何标准。如果我可以指定类似“如果 column_name 以 Question_% 开头”或“如果 column_ID > 3 ' 但如果我在 COLUMN 之后添加 WHERE,则会出现错误。

我正在为使用 c# 的 asp.net 应用程序编写此内容。

对此的任何帮助将不胜感激。我去散步让自己冷静下来。

4

5 回答 5

6

请重新考虑您的数据库设计。完全删除问题列并添加表格

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

但是,这将删除所有行:例如,您不能有一些带有 Answer 的行和一些带有 Question 的行。

如果我对您的理解正确,我将实现为子表以允许 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 回答
0

为了那些后来发现这个问题的人的利益,这种事情可以作为有条件地对查询结果执行命令的基础(在这种情况下,检查列只包含NULL在采取诸如删除列之类的操作之前):

IF (SELECT COUNT([my column]) FROM [my table] WHERE [my column] IS NOT NULL) = 0
  PRINT 'remove' ELSE PRINT 'keep';
于 2014-07-21T14:34:10.620 回答