2017-11-04 55 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