0

SQL Server2008R2データベースに次のストアドプロシージャがあります

ALTER PROCEDURE [dbo].[usp_send_email] 
    @pStatus Int Out,
    @pEMailId Int Out,
    @pSenderUserName varchar(MAX),  
    @pReceivers VarChar(50),         **-- this column can have csv values**
    @pSub NVarChar(100),
    @pCon NVarchar(MAX),
    @pHasAttachments Bit
AS
BEGIN
   --SET NOCOUNT ON;

   Insert Into MessagingMessage
      (
       CreatedBy,
       [Subject],
       Body,
       HasAttachments
      )
     Values
     (    
      @pSenderUserName,
      @pSub,
      @pCon,
      @pHasAttachments
      )
    SET @pEMailId = SCOPE_IDENTITY()  

     Insert Into MessagingMessageReceipient
      (
       MessageId,
       ReceipientId,
       ReceipientType
      )
     Values
     (    
      @pEMailId,
      @pReceivers,
      1
      )
     SET @pStatus  = SCOPE_IDENTITY() 

END

上記のコードでは、最初のステートメントを1回だけ実行しますが、コンマで区切られたユーザー名ごとに2番目の挿入ステートメントをループで実行します。パラメーターとして指定されたCSV値はC#コードによって既に検証されているため、検証する必要はありません。

4

1 に答える 1

1

このリンクの使用:CSVデータを分割して単一のステートメントで新しいテーブルに挿入する方法は?、csvをテーブルに解析するために使用できる関数があり、以下のコードで使用しました。次を試してください

Insert Into MessagingMessageReceipient
  (
   MessageId,
   ReceipientId,
   ReceipientType
  )
  SELECT
   @pEMailId,
   csv.Part,   -- each @pReceiver
   1
  FROM 
     dbo.inline_split_me(',',@pReceivers) csv

そして、関数は以下にコピーされます

CREATE FUNCTION inline_split_me (@SplitOn char(1),@String varchar(7998))
RETURNS TABLE AS
RETURN (WITH SplitSting AS
           (SELECT
                LEFT(@String,CHARINDEX(@SplitOn,@String)-1) AS Part
                    ,RIGHT(@String,LEN(@String)-CHARINDEX(@SplitOn,@String)) AS Remainder
                WHERE @String IS NOT NULL AND CHARINDEX(@SplitOn,@String)>0
            UNION ALL
            SELECT
                LEFT(Remainder,CHARINDEX(@SplitOn,Remainder)-1)
                    ,RIGHT(Remainder,LEN(Remainder)-CHARINDEX(@SplitOn,Remainder))
                FROM SplitSting
                WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)>0
            UNION ALL
            SELECT
                Remainder,null
                FROM SplitSting
                WHERE Remainder IS NOT NULL AND CHARINDEX(@SplitOn,Remainder)=0
           )
           SELECT Part FROM SplitSting
       )
于 2012-08-26T11:22:53.550 に答える