我想将数据从SQL 2008服务器导出到文件,csv或excel无关紧要。在数据库中,我有两个实体,问题和答案。问题是问题有多个答案。然后,连接将导致每个问题有多行。我怎么能这样做,结果只是每个问题和答案一行,只是每个答案添加一个新列。像这样:
表格结构:
Question
-------------
Id
Text
Category
Answer
-------------
Id
Text
IsCorrect
QuestionId
结果示例:
Col1 Col2 Col3 Col4 Col5 Col6 Col7
Result1: Question1, Question1Text, Answer1Prop1, Answer1Prop2, Answer2Prop1, Answer2Prop2, null
Result2: Question2, Question2Text, Answer3Prop1, Answer3Prop2, Answer4Prop1, Answer4Prop2, Answer5Prop3
答案 0 :(得分:1)
如果您可以使用包含所有问题的连接和包含多行的所有答案生成结果,就像您描述的那样,我认为您可以使用游标循环遍历所有问题和答案,然后有一个temptable / “哈希表”(#tableOfAnswers)来保存你的最终结果。对于问题的每个答案,您可以更改#table并添加新列。
这样的事情可能会让你朝着正确的方向前进。
如果您的结果看起来像这样: (在我的例子中,我将结果存储在名为“#q”的临时表中)
QuestionId text
1 answer1
1 answer2
1 answer3
1 answer4
2 answer1
2 answer2
然后你可以在结果上声明一个光标
Declare @questionId int
, @questionText varchar(max)
, @prevId int
, @colNo int = 1
, @colMax int = 0
, @i int = 1
, @sql nvarchar(max)
, @nulls nvarchar(max) = ''
Create table #tempTable
(
QuestionId int not null,
Col1 varchar(max) null
)
Declare question_cursor cursor for
Select QuestionId, text
From #q
Open question_cursor
FETCH NEXT FROM question_cursor
INTO @questionId, @questionText
Set @prevId = 0
WHILE @@FETCH_STATUS = 0
BEGIN
If (@prevId = @questionId)
Begin
If (@colNo > @colMax)
Begin
Set @sql = N'alter table #tempTable add Col' + cast(@colNo as varchar) + ' varchar(max) null'
exec sp_executesql @statement = @sql
Set @colMax = @colMax + 1
End
Set @sql = N'update #tempTable set Col' + cast(@colNo as varchar) + ' = ''' + @questionText + ''' where QuestionId = ' + cast(@questionId as varchar)
print @sql
exec sp_executesql @statement = @sql
Set @colNo = @colNo + 1
End
Else Begin
Set @prevId = @questionId
Set @colNo = 1
while (@i <= @colMax)
begin
set @nulls = @nulls + ', null'
set @i = @i + 1
end
Set @sql = N'insert into #tempTable values (' + cast(@questionId as varchar) + ', ''' + @questionText + '''' + isnull(@nulls, '') +')'
print @sql
exec sp_executesql @statement = @sql
Set @colNo = @colNo + 1
End
FETCH NEXT FROM question_cursor
INTO @questionId, @questionText
END
Close question_cursor
Deallocate question_cursor
Select * from #tempTable
这会产生如下结果:
QuestionId Col1 Col2 Col3 Col4
1 text1 text2 text3 text4
2 text1 text2 NULL NULL
并不像.Net(或者甚至是javascript)那样优雅地处理这样的问题..但是,你要做什么? :) 我希望这可能会对你的问题有所了解:)
要将其导出到文件,我只需将结果复制/粘贴到Sql Management Studio中并将其粘贴到Excel或其他内容中;)