我有一个名为 assignRole 的表。
我正在传递 userid (int) csv 字符串,并传递 roleid(int)。
我想要一个存储过程,它从字符串中拆分用户 ID 并获取角色 ID 并将这些值插入表中。这对用户 ID 字符串中的所有值都会发生。
我有一个名为 assignRole 的表。
我正在传递 userid (int) csv 字符串,并传递 roleid(int)。
我想要一个存储过程,它从字符串中拆分用户 ID 并获取角色 ID 并将这些值插入表中。这对用户 ID 字符串中的所有值都会发生。
我喜欢使用表值函数进行拆分。
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]
首先,创建一个函数:
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, ',');