我有一种情况,对于那些特权ID,@ PRIVILEGEID将具有多个值,并且@ROLEID每次都是相同的。
所以我必须将数据插入表中。 以下是程序代码:-
ALTER PROCEDURE [dbo].[ADD_ROLE] (
@ROLENAME varchar(50),
@PRIVILEGEID int )
AS
BEGIN
DECLARE @QUERY varchar(1000);
DECLARE @ROLEID int;
SET @ROLEID = ( SELECT Max(ROLEID)
FROM ( SELECT
Max(CREATED_DATE) AS MAX_DATE,
ROLEID
FROM ROLE
WHERE ROLENAME = @ROLENAME
--(ROlename can be changed dynamically, take 'Manager' as example as of now.)
AND CREATED_DATE IS NOT NULL
GROUP BY ROLEID ) X );
--PRINT @ROLEID
SET @QUERY = 'INSERT INTO [ROLES_PRIVILEGES] (ROLEID,PRIVILEGEID) VALUES (''' + Cast(@ROLEID AS varchar) + ''',''' + Cast(@PRIVILEGEID AS varchar) + ''')';
EXECUTE ( @QUERY );
END;
现在@PRIVILEGEID将具有一个动态值列表,其中包含固定@ROLEID的多个值,我的问题是我一次只能传递一个@PRIVILEGEID。
执行ADD_ROLE'BACKOFFICE',@ PRIVILEGEID @ PRIVILEGEID = [2、3、4、5、6]
-(如何为PRIVILEGEID传递多个值)
我也尝试了While循环,但不确定如何实现。
请帮助。
答案 0 :(得分:0)
这里是一个示例,其中我用逗号分隔的字符串并转储到表中。该过程通过将其转换为xml并使用xmlqry进行解析而起作用。我喜欢它,因为我觉得它更易于阅读,而且看起来也更容易混淆。
让我知道它是否对您有用。
USE yourDatabase
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[_parsedelimited]
(
@str varchar(max)
)
AS
BEGIN
if object_id('tempdb..#Emails') is not null drop table #Emails;
CREATE TABLE #Emails (Email varchar(2500));
Declare @x XML;
select @x = cast('<A>'+ replace(@str,',','</A><A>')+ '</A>' as xml);
INSERT INTO #Emails (Email)
select
t.value('.', 'varchar(50)') as inVal
from @x.nodes('/A') as x(t);
SELECT * FROM #Emails;
drop table #Emails;
END
GO
答案 1 :(得分:0)
请考虑以下内容:
declare @role varchar(20) = 'BACKOFFICE',
@PRIVILEGEID varchar(100) = '2,3,4,5,6';
select @role, *
from string_split(@PRIVILEGEID, ',');
使用该选择,您应该可以将其插入到想要的任何表中。