sql-server - 如何在动态插入查询的存储过程中将参数作为列表传递
问题描述
我有一个场景,@PRIVILEGEID 将有多个值,@ROLEID 每次对于这些特权 ID 都是相同的。
所以我必须将数据插入表中。以下是程序代码:-
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 循环,但不确定如何实现它。
请帮忙。
解决方案
这是一个示例,我将逗号分隔的字符串转储到表中。此过程通过将其转换为 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
推荐阅读
- ionic-framework - 如果存储上的 Var 不显示选项卡
- c++ - 错误 C2061:语法错误:编译 algparam.h 时的标识符“缓冲区”
- javascript - 使用 JavaScript 函数导入 XML
- javascript - Change the color of Anchor when clicked?
- python - Strange behaviour of Python difflib library for sequence matcher
- angularfire - Returning $key in AngularFire 5
- python - Python3.5 Asyncio - Preventing task exception from dumping to stdout?
- python - How can I make a python encryption and decryption program with my own criptgraphy?
- ios - NSURLErrorDomain -1001 设备上的请求超时
- wpf - 运行时的 WPF 绑定不起作用