【发布时间】:2012-07-06 14:05:43
【问题描述】:
我有一个名为 assignRole 的表。
我正在传递 userid (int) csv 字符串,并传递 roleid(int)。
我想要一个存储过程,它将用户 ID 从字符串中分离出来,并获取角色 ID 并将这些值插入到表中。这会发生在用户 ID 字符串中的所有值上。
【问题讨论】:
标签: sql-server-2008 java-stored-procedures
我有一个名为 assignRole 的表。
我正在传递 userid (int) csv 字符串,并传递 roleid(int)。
我想要一个存储过程,它将用户 ID 从字符串中分离出来,并获取角色 ID 并将这些值插入到表中。这会发生在用户 ID 字符串中的所有值上。
【问题讨论】:
标签: sql-server-2008 java-stored-procedures
首先,创建一个函数:
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, ',');
【讨论】:
我喜欢使用表值函数进行拆分。
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]
【讨论】: