0

我有一个名为 assignRole 的表。

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

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

4

2 回答 2

0

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

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

CREATE FUNCTION [dbo].[StrSplit] (@String VARCHAR(MAX), @Delimiter char(1)) 返回@Results TABLE (Items NVARCHAR(MAX)) 作为开始声明@INDEX INT DECLARE @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

结尾

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

于 2012-07-06T14:16:15.163 回答
0

首先,创建一个函数:

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, ',');
于 2012-07-06T14:08:18.737 回答