2016-02-03 57 views
0

在我的ASP.NET web應用程序我有一個DataTable填充數據插入到tblChildren
DataTable傳遞給stored procedure
在SP我需要讀取的每行(E.I 環路通過數據表),(在tblParents與根據相關數據)改變幾個列在它和僅然後將行插入tblChildren。我不認爲TVP會做(不知道...不太熟悉它)。
當然,我可以遍歷應用程序中的DataTable行並將每個行分別發送給SP,但這意味着數百次往返於SqlServer。多次插入

我遇到了兩種可能,可能實現:(1)臨時表 (2)遊標。
第一是相當混亂,第二,據我所知,不建議)

任何指導將不勝感激。

編輯:
我嘗試的用戶定義的表類型的辦法。
enter image description here

做是因爲我填充在TT_Child_Family_Id列值的表型(TT_Children)。
在現實生活中,雖然,我不知道這些價值觀和我需要環通@my_TT_Children併爲每一行得到tblFamilies的價值,這樣的事情:

SELECT Family_Id FROM tblFamilies WHERE Family_Name = TT_Child_Last_Name 

(假設總是相當於tblFamilies.Family_Name中的TT_Child_Last_Name)

所以我的問題是 - 如何遍歷表類型併爲每一行查找不同表中的值?

EDIT 2(解決方案):
作爲阿米爾的完美答卷,存儲過程應該是這樣的:

ALTER PROCEDURE [dbo].[usp_Z_Insert_Children] 
@my_TT_Children TT_Children READONLY 
AS 
BEGIN 
    INSERT INTO tblChildren(Child_FirstName, 
          Child_LastName, 
          Child_Family_ID) 
     SELECT Cld.tt_child_FirstName, 
       Cld.tt_child_LastNAme, 
       Fml.Family_Id FROM @my_TT_Children Cld 
        INNER JOIN tblFamilies fml 
         ON Cld.TT_Child_LastName = Fml.Family_Name 
END 

由阿米爾注:在tblFamily列FAMILY_NAME必須是唯一的,最好索引。我也注意到,如果TT_Child_LastName在tblFamilies中沒有匹配,那麼這行不會被插入,我永遠不會知道它,這意味着如果所有行都被成功處理,我必須檢查它。

+0

爲什麼不能使用第一個用來填充DataTable的存儲過程? –

+0

我從Excel工作表填充DataTable。 – gadi

+0

[如何將數據表插入到SQL Server數據庫表中?](http://stackoverflow.com/questions/9075159/how-to-insert-a-data-table-into-sql-server-database -table) –

回答

1

您可以將tblFamilies加入到過程中的插入中,並從那裏獲取值。比循環更有效。 或者創建一個遊標並一次做一個孩子。 1)確保tblFamilies中只有一個FamilyName。 2)確保如果tblFamilies是一個大表,那麼FamilyName列會被編入索引。

INSERT INTO tblChildren(Child_FirstName, Child_LastName, Child_Family_ID) 
SELECT Cld.tt_child_FirstName, 
Cld.tt_child_LastNAme, 
Fml.FamilyID 
FROM @my_TT_Children Cld 
INNER JOIN tblFamilies fml on Cld.TT_Child_LastName = Fml.FamilyName 

但請注意,如果tblFamilies每個Family_Name有多個條目,那麼這將複製數據。在這種情況下,您需要在其中添加更多限制。

+0

我知道它,我知道它......我剛進入INNER JOIN的世界,當你想出完美的時候,我正在與它混在一起答案完美的工作!謝謝一堆!我會將它標記爲答案,並用您的解決方案編輯問題(它有幾個小字段名稱拼寫錯誤).BTW,當然,tblFamilies中的Family_Name是唯一的索引。 – gadi