首页 > 解决方案 > 如何在动态插入查询的存储过程中将参数作为列表传递

问题描述

我有一个场景,@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 循环,但不确定如何实现它。

请帮忙。

标签: sql-server

解决方案


这是一个示例,我将逗号分隔的字符串转储到表中。此过程通过将其转换为 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

推荐阅读