2016-11-16 27 views
0

我們使用基本上通過SQL表爲對象設置權限的產品。我正在嘗試創建一個存儲過程,它基本上將一個用戶的權限設置爲與另一個用戶相同。這是我到目前爲止:嘗試創建將構建多個條目的存儲過程

CREATE PROCEDURE SETPRODUCTS 
    @sourceCC BIGINT, 
    @targetCC BIGINT 
BEGIN 
    DECLARE @SQL varchar(5000) 

    DECLARE @Sequence_Id varchar(50) 
    SET @sequence_id = 0 

    BEGIN TRANSACTION 

    DELETE FROM TCC WHERE CC_Id = @targetCC 

    DECLARE cursorCurrent CURSOR FOR 
     SELECT MAX(TCC_Id) + 1 
     FROM TCC WITH (tablockx holdlock) 

    OPEN cursorCurrent 
    FETCH NEXT FROM cursorCurrent INTO @sequence_id 

    IF (@sequence_id IS NULL) 
     SET @sequence_id = 1 

    INSERT INTO TCC (TCC_Id, T_Id, CCC_Id) 
    VALUES (@sequence_id, 
     (SELECT T_Id FROM TCC WHERE CC_Id = @sourceCC), @targetCC) 

    CLOSE cursorCurrent 
    DEALLOCATE cursorCurrent 

    COMMIT TRANSACTION 
END 

我得到的錯誤是,我的子查詢有多個值,這是真的。我想從該子查詢中獲取每個條目並使用它將新行插入到我的數據庫中。

任何幫助將不勝感激!

+0

你爲什麼要建立一個光標,然後只使用第一行???在這裏你的TCC_Id要非常小心。使用MAX + 1很容易出現很多錯誤。即使使用tablockx掛鎖,你仍然可以得到一些錯誤。我寧願在這裏使用一個身份,因爲它已經處理了所有的併發問題,這些問題對你自己來說是非常具有挑戰性的。 –

+0

我將如何去使用身份? –

+0

您將在TCC中有一列是標識列。然後整個過程成爲一個沒有額外代碼的單一插入語句。 https://msdn.microsoft.com/en-us/library/ms186775.aspx –

回答

1

試試這個版本的插入的:

INSERT INTO TCC (TCC_Id, T_Id, CCC_Id) 
    SELECT @sequence_id, @targetCC, T_Id FROM TCC WHERE CC_Id = @sourceCC 
0

改變你的程序如下

Alter PROCEDURE SETPRODUCTS 
@sourceCC BIGINT, 
@targetCC BIGINT 
BEGIN 
DECLARE @SQL varchar(5000) 

DECLARE @Sequence_Id varchar(50) 
SET @sequence_id = 0 

BEGIN TRANSACTION 

DELETE FROM TCC WHERE CC_Id = @targetCC 

DECLARE cursorCurrent CURSOR FOR 
    SELECT MAX(TCC_Id) + 1 
    FROM TCC WITH (tablockx holdlock) 

OPEN cursorCurrent 
FETCH NEXT FROM cursorCurrent INTO @sequence_id 
Declare @total int 
IF (@sequence_id IS NULL) 
    SET @sequence_id = 1 

    SELECT T_Id,ROW_NUMBER() over (order by TCC_id) as rowno into #temp 
    FROM TCC WHERE CC_Id = @sourceCC 
    select @total=COUNT(*) from #temp 
    while(@rowno <> @total) 
    begin 
     Declare @t_id int 
     set @t_id=(select top 1 T_id from #temp where [email protected]) 

     INSERT INTO TCC (TCC_Id, T_Id, CCC_Id) 
     VALUES (@sequence_id,@t_id,@targetCC) 

     set @[email protected]+1 
    End 
DROP TABLE #temp 
CLOSE cursorCurrent 
    DEALLOCATE cursorCurrent 
    COMMIT TRANSACTION 
    END