2017-11-04 58 views
0

這裏是要插入的存儲過程。在while循環中將多行保存在SQL Server中之後

CREATE PROCEDURE [dbo].[SP_SaveMail] 
    @Subject NVARCHAR(550), 
    @Message NVARCHAR(550), 
    @ParentID INT, 
    @SenderID INT, 
    @SenderType INT, 
    @ReceiverID NVARCHAR(MAX), 
    @ReceiverType INT 
AS 
BEGIN 
    DECLARE @MailID INT 

    INSERT INTO [dbo].[tbl_Mail] (Subject, Message, ParentID, IsRead, IsDeleted) 
    VALUES (@Subject, @Message, @ParentID, 0, 0) 

    SET @MailID = (SELECT @@identity) 

    if (@MailID > 0) 
     -- After this I want to split the @ReceiverID 
     -- The code to split the @ReceiverID is [dbo].SplitString(@ReceiverID, ',') 

     -- After split I want to insert it into the table [dbo].[tbl_Mail_Mapping] one by one through for loop or while loop. 
    -- BEGIN 
    -- DECLARE @tags NVARCHAR(400) 

    -- SET @tags = ([dbo].SplitString(@ReceiverID, ',')) 
    -- WHILE LEN(@tags) > 0 
    -- BEGIN 
    --  INSERT INTO [dbo].[tbl_Mail_Mapping](MailID, SenderID, SenderType, ReceiverID, ReceiverType) 
    --  VALUES (@MailID, @SenderID, @SenderType, @tags, @ReceiverType) 
    -- END 
END 

下面是代碼分裂:

ALTER FUNCTION [dbo].[SplitString] 
    (@Input NVARCHAR(MAX), 
    @Character CHAR(1)) 
RETURNS @Output TABLE (Item NVARCHAR(1000)) 
AS 
BEGIN 
    DECLARE @StartIndex INT, @EndIndex INT 

    SET @StartIndex = 1 

    IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character 
    BEGIN 
     SET @Input = @Input + @Character 
    END 

    WHILE CHARINDEX(@Character, @Input) > 0 
    BEGIN 
     SET @EndIndex = CHARINDEX(@Character, @Input) 

     INSERT INTO @Output(Item) 
      SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1) 

     SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input)) 
    END 

    RETURN 
END 

誰能告訴我怎麼能寫拆分後while循環,並插入查詢插入到表?

注意:@ReceiverID看起來像這樣:3,2,5即在這裏,我通過調用[dbo].SplitString(@ReceiverID, ',')拆分@ReceiverID。拆分後,它會返回像物品欄3 2 5

請參考此截圖表:

enter image description here

拆分後誰能告訴我怎麼寫while循環保存?

+0

分離後如何使用while循環...來保存數據? – asasasaa

+0

**錯字**警報 - 這是一個**接收器** - 在「我」之前的「e」(不是「接收者」....) –

回答

1

你並不需要使用一個循環。使用表值函數中的SELECT:

INSERT INTO [dbo].[tbl_Mail_Mapping](MailID, SenderID, SenderType, RecieverID, RecieverType) 
SELECT @MailID 
     ,@SenderID 
     ,@SenderType 
     ,r.Item 
     ,@RecieverType 
FROM [dbo].[SplitString](@RecieverID, ',') r 
WHERE Item != '' 
0

在這裏,我想你也不需要使用while循環或功能,你能做到這一點只需通過使用如下方法XML

INSERT INTO [dbo].[tbl_Mail_Mapping] 
(MailID, 
SenderID, 
SenderType, 
RecieverID, 
RecieverType 
) 
     SELECT @MailID, 
       @SenderID, 
       @SenderType, 
       split.a.value('.', 'NVARCHAR(MAX)'), 
       @RecieverType 
     FROM 
     (
      SELECT CAST('<M>'+REPLACE(@RecieverID, ',', '</M><M>')+'</M>' AS XML) AS Data 
     ) r 
     CROSS APPLY Data.nodes('/M') split(a) 
     WHERE split.a.value('.', 'NVARCHAR(MAX)') != ''; 
SELECT * 
FROM [dbo].[tbl_Mail_Mapping]; 
+0

您能否爲上述查詢寫下正確的格式 – asasasaa

+0

在[dbo ] [tbl_Mail_Mapping]我已經進入了多個列..你只是看我的問題代碼。 – asasasaa