2013-02-01 1 views
0

쿼리 언어로 SQL Server 2012 및 T-SQL을 사용합니다.TVP에서 여러 값을 가진 T-SQL UPSERT 테이블

매개 변수 (@userGroupID) 및 많은 함수 ID로 전달 된 하나의 ID 값을 사용하여 [cross_function_user]에서 여러 열을 업데이트/삽입하는 데 도움이 필요합니다. 그것들은 C#의 List이며, Item이라는 이름의 int 열만있는 Table Valued Parameter로 sproc에 전달됩니다.

ALTER PROCEDURE [whatever] 
    @userGroupID INT, 
    @listID AS IntList READONLY 
AS 
BEGIN 
     SET NOCOUNT ON; 
    MERGE INTO [dbo].[cross_function_user] USING @listID 
    ON [dbo].[cross_function_user].id_group_user = @userGroupID 
    WHEN MATCHED THEN 
     UPDATE SET [cross_function_user].id_group_user = @userGroupID, 
        [cross_function_user].id_function = (SELECT Item FROM @listID) 
    WHEN NOT MATCHED THEN 
     INSERT (id_group_user, id_function) 
     VALUES (@userGroupID, (SELECT Item FROM @listID)); 

END 

첫째, 오류 물론 '서브 쿼리는 하나 개 이상의 결과를 반환',하지만 난이 재 작성하는 기술이 부족하고, 내 upsert이 올바른 방법으로 작성된 경우 정말 모르겠어요. 어떤 도움을 주시면 감사하겠습니다.

+1

IntList에는 단 하나의 열만 있습니까? 뭐라고 해요? MERGE 문에서 열을 참조해야합니다. 이 예제에서는 TVP의 별칭을 지정하고 해당 열을 참조 할 수 있습니다. http://sqlblogcasts.com/blogs/simons/archive/2008/06/17/SQL-Server-2008---Killer-features --- MERGE-and-Valued-Parameters.aspx –

+0

감사합니다. ElectriLlama, 링크의 기사가 완벽하게 해결되었습니다! –

답변

2

이 시도 :

당신은 당신의 TVP의 열 이름으로 YourColumn을 교체해야합니다.

ALTER PROCEDURE [whatever] 
@userGroupID INT, 
@listID AS IntList READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 
    MERGE INTO [dbo].[cross_function_user] USING @listID 
    ON [dbo].[cross_function_user].id_group_user = @userGroupID 
    WHEN MATCHED THEN 
     UPDATE SET [cross_function_user].id_function = S.YourColumn 
    WHEN NOT MATCHED THEN 
     INSERT (id_group_user, id_function) 
     VALUES (@userGroupID, S.YourColumn); 

END