簡體   English   中英

使用存儲過程將記錄從用戶定義的表類型插入SQL Server數據庫

[英]Insert records into SQL Server database from user defined table type using stored procedure

情境

我有這個數據表,當用戶將角色分配給其他用戶時,我將從中獲得該數據表:

在此處輸入圖片說明

在上表中,我為用戶mushtaq分配了新角色,並通過以下過程將其插入數據庫中。

ALTER PROCEDURE [dbo].[SP_ROLE_ASSIGNMENT_ASSIGN_ROLES_TO_USER]
    @RoleAssignmentDT _ROLEASSIGNMENTSCHEMA ReadOnly
AS
BEGIN TRY
BEGIN TRANSACTION
    IF EXISTS (SELECT Role_ID 
               FROM Role_Assignment RA 
               INNER JOIN @RoleAssignmentDT t ON t._Role_ID = Ra.Role_ID 
                                              AND RA.Username = t._Username)
    BEGIN
        UPDATE Role_Assignment
        SET Role_Assign = 0, 
            Modified_By_ID = t._Modified_By_ID, 
            Modified_Date = GETDATE()
        FROM @RoleAssignmentDT t
        WHERE Role_Assignment.Role_ID <> t._Role_ID 
          AND Role_Assignment.Username = t._Username
          AND (t._Role_Assign = 1 AND Role_Assignment.Role_Assign = 1)

        UPDATE Role_Assignment
        SET Role_Assign = t._Role_Assign, 
            Modified_By_ID = t._Modified_By_ID, 
            Modified_Date = GETDATE()
        FROM @RoleAssignmentDT t
        WHERE Role_Assignment.Role_ID = t._Role_ID 
          AND Role_Assignment.Username = t._Username
    END
    ELSE
    BEGIN
        INSERT INTO Role_Assignment (Role_ID, Username, Role_Assign, Prepared_By_ID, Prepared_Date)
            SELECT
                t._Role_ID, t._Username, t._Role_Assign, t._Prepared_By_ID, GETDATE()  
            FROM 
                @RoleAssignmentDT t
    END

    COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRAN --RollBack in case of Error

-- you can Raise ERROR with RAISEERROR() Statement including the details of the exception
--RAISERROR('No Record Inserted, Contact to administrator',16,1)
    DECLARE @Msg NVARCHAR(MAX)  
    SELECT @Msg=ERROR_MESSAGE() 
    RAISERROR('Error Occured: %s', 20, 101,@msg) WITH LOG
END CATCH

以下是我的SQL Role_Assignment表的架構

在此處輸入圖片說明

現在,當我向上述其他用戶分配新角色時,過程只會更新ahmer用戶。 因為當我的過程獲取數據表時,我的IF條件就會運行並找到用戶ahmer並對其進行更新。

我想要的是

我希望存儲過程僅檢查和更新SQL Server表Role_Assignment存在的那些用戶; 如果它們不存在,請先插入它們。

我想提供有關當前問題的簡短信息。 請幫助我在存儲過程中進行哪些修改,以便它首先檢查天氣用戶是否存在。 之前不存在的對象然后將其插入並更新其他存在的對象。

在存儲過程中嘗試以下方法代替您的t-sql代碼

 MERGE Role_Assignment ra
    USING @RoleAssignmentDT t
    ON Role_Assignment.Username = t._Username
    WHEN MATCHED AND
       Role_Assignment.Role_ID <> t._Role_ID 
    and (t._Role_Assign = 1 and Ra.Role_Assign = 1) THEN
       UPDATE
        Set Role_Assign = 0, Modified_By_ID = t._Modified_By_ID, Modified_Date = GETDATE()
        From @RoleAssignmentDT
    WHEN MATCHED AND
    Role_Assignment.Role_ID = t._Role_ID  THEN
      UPDATE
        Set Role_Assign = t._Role_Assign, Modified_By_ID = t._Modified_By_ID, Modified_Date = GETDATE()
        From @RoleAssignmentDT
    WHEN NOT MATCHED BY TARGET THEN
      Insert (Role_ID,Username,Role_Assign,Prepared_By_ID,Prepared_Date)
        VALUES (t._Role_ID, t._Username, t._Role_Assign, t._Prepared_By_ID, GETDATE());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM