【问题标题】:How to run SQL Server stored procedure query for each value of a CSV如何为 CSV 的每个值运行 SQL Server 存储过程查询
【发布时间】:2012-08-26 10:57:22
【问题描述】:

我的 SQL Server 2008 R2 数据库中有以下存储过程

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

在上面的代码中,我只想运行第一个语句一次,但第二个插入语句循环中每个逗号分隔的 username.CSV 值作为参数已经通过 C# 代码验证,因此无需验证。

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案1】:

    使用此链接:how to split and insert CSV data into a new table in single statement?,您可以使用一个函数将 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
           )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多