2012-02-27 40 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會比較慢,更難保持比在應用程序代碼版本。