【问题标题】:stored procedure for inserting comma seperated values in table using ms sql?使用ms sql在表中插入逗号分隔值的存储过程?
【发布时间】:2012-07-06 14:05:43
【问题描述】:

我有一个名为 assignRole 的表。

我正在传递 userid (int) csv 字符串,并传递 roleid(int)。

我想要一个存储过程,它将用户 ID 从字符串中分离出来,并获取角色 ID 并将这些值插入到表中。这会发生在用户 ID 字符串中的所有值上。

【问题讨论】:

    标签: sql-server-2008 java-stored-procedures


    【解决方案1】:

    首先,创建一个函数:

    CREATE FUNCTION [dbo].[SplitInts]
    (
       @List       VARCHAR(MAX),
       @Delimiter  CHAR(1)
    )
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
       RETURN ( SELECT Item = CONVERT(INT, Item) FROM ( 
         SELECT Item = x.i.value('(./text())[1]', 'int') FROM ( 
           SELECT [XML] = CONVERT(XML, '<i>' + REPLACE(@List, @Delimiter, '</i><i>') 
           + '</i>').query('.') ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
         WHERE Item IS NOT NULL
       );
    

    现在你可以说:

    INSERT dbo.assignRole(RoleID, UserID)
      SELECT @RoleID, Item
      FROM dbo.SplitInts(@UserIDList, ',');
    

    【讨论】:

    • @user1506955 没问题。下次请搜索,这可能是 SQL Server 最常见的问题之一。
    【解决方案2】:

    我喜欢使用表值函数进行拆分。

    IF OBJECT_ID (N'dbo.StrSplit') 不为空 DROP FUNCTION dbo.[StrSplit] 去吧

    创建函数 [dbo].[StrSplit] ( @String VARCHAR(MAX), @Delimiter char(1) ) 回报 @结果表 ( 项目 NVARCHAR(MAX) ) 作为 开始 声明@INDEX INT 声明 @SLICE nvarchar(MAX)

    -- HAVE TO SET TO 1 SO IT DOESNT EQUAL ZERO FIRST TIME IN LOOP
    SELECT @INDEX = 1
    
    
    -- Early exit if passed string is null
    IF @String IS NULL RETURN
    
    WHILE @INDEX !=0
    BEGIN 
              -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
              SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
    
              -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
              IF @INDEX !=0
                     SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
              ELSE
                     SELECT @SLICE = @STRING
              -- PUT THE ITEM INTO THE RESULTS SET
              INSERT INTO @Results(Items) VALUES(@SLICE)
              -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
              SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
              -- BREAK OUT IF WE ARE DONE
              IF LEN(@STRING) = 0 BREAK
    END
    RETURN
    

    结束

    去 GRANT SELECT ON [dbo].[StrSplit] TO [public]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多