Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拆分多行后,通过while循环在SQL Server中保存_Sql_Sql Server - Fatal编程技术网

拆分多行后,通过while循环在SQL Server中保存

拆分多行后,通过while循环在SQL Server中保存,sql,sql-server,Sql,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 DECLA

下面是要插入的存储过程

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]来拆分@ReceiverID。SplitString@ReceiverID, ','. 拆分后,它将返回一个包含列项目3 2 5的表

请参阅此屏幕截图:


拆分后,有人能告诉我如何编写while循环来保存吗?

在这里,我认为您不需要使用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];

您不需要使用循环。使用表值函数中的SELECT:

插入到[dbo].[tbl_Mail_Mapping]MailID,SenderID,SenderType,receiverId,receiverType 选择@MailID ,@SenderID ,@SenderType ,r.项目 ,@ReceiveType 来自[dbo]。[SplitString]@ReceiverId,,'r 何处项目!=
拆分后,我如何使用while循环…保存数据?输入错误警报-它是一个接收者-在我不是接收者之前…你能为上面的查询写下一个正确的格式吗[dbo]。[tbl\u Mail\u Mapping]我已经输入了多列。你只需查看我的问题代码。