如何在动态插入查询的存储过程中将参数作为列表传递

时间:2019-09-11 12:15:21

标签: sql-server

我有一种情况,对于那些特权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循环,但不确定如何实现。

请帮助。

2 个答案:

答案 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, ',');

使用该选择,您应该可以将其插入到想要的任何表中。