2012-02-27 36 views
-1

我想在SQL Server中编写一个存储过程,它将消除我的C#程序中的一些逻辑。我现在正在做的是查询是在视图中。然后我用这个观点列出一个清单。在SQL Server 2008 R2上重复执行并将它们压缩为1行?

List<MyView> listOrdered = new List<MyView>(); 

这是它变得毛茸茸的地方。查询返回重复的行。我不想删除要将它们组合成1行的重复行。除了1列以外,这些行是相同的。

例子:

UID  Name  Age Child 
1  John  50  Sally 
1  John  50  Steve 
2  Joseph 42  Timmy 
2  Joseph 42  Billy 

所以我在做什么在C#中编写的逻辑,说:(伪代码)

foreach(item in list) 
{ 
     if (UID != UIDCurrent) 
     { 
      Build Row 
      AppendRow to list 
     } 
     else 
     { 
      Append Child Column to Current Child Column 
     } 
} 

基本上,它给了我:

UID  Name  Age Children 
1  John  50 Sally, Steve 

但不是在C#中做这个逻辑,我想做一个存储过程。所以我怎么才能让SQL Server为每行而不是多行组合子列。

如果您需要任何其他帮助您,我会回复。

哦,大家相信我,我也不想这样做。我使用的数据库非常庞大而且复杂,用C#做这件事很明智并且工作正常,但我被要求将我在C#中执行此操作的函数转换为存储过程。我只想看看这是否可能。

+2

说实话。在你的代码中执行它。那就是那种逻辑所属的地方。注意:如果将数据库规范化为至少3NF,代码将变得更清晰。 – JohnFx 2012-02-27 19:22:56

+1

**在'C#'中执行。** – JNK 2012-02-27 19:23:25

回答

2

如果您想在数据库中执行此操作,应该可以工作,但您应该考虑在前端执行此操作。

SELECT UID,  
    Name, 
    Age, 
    STUFF(
    (SELECT ',' + Child AS [text()] 
      FROM parentChildren b 
      WHERE a.UID = b.UID 
    FOR XML PATH('')),1,1,'') [ChildConcat] 
FROM parentChildren a 
4

这演示了一个糟糕的桌子设计。修复它的根目录,然后在db或C#代码中没有这个愚蠢的逻辑。

代替

people(UID, Name, Age, Child) 

尝试

people(UID, Name, DateOfBirth) 
children(Parent references people.UID, child references people.UID) 

你可以离开,而不是移动到出生日期年龄,但它的确是一个更好的主意,做这种方式。

0

这是100%,毫无疑问,须在应用程序代码来处理,不是在数据库!

SQL在字符串操作操作中执行得相当差,尤其是与像C#这样的迭代语言相比。你希望你的数据库传递给你实际的数据,然后你如何显示要在应用层中处理的数据。

任何试图解决这个在SQL会比较慢,更难保持比在应用程序代码版本。