Sql server 使用where in语句的SQL存储过程

Sql server 使用where in语句的SQL存储过程,sql-server,Sql Server,我正在尝试将数据从一个表插入到另一个表。但我需要在where子句中使用多个特定ID。而且,我需要在运行proc时定义这些id。查询如下: CREATE PROCEDURE insert_hh @id int AS BEGIN SET IDENTITY_INSERT test_HH ON INSERT INTO test_HH (ID,Beneficiary_Name,Family_Members, [M_50_yrs], [F_50_yrs], [M_50_18], [F_50_18], [

我正在尝试将数据从一个表插入到另一个表。但我需要在where子句中使用多个特定ID。而且,我需要在运行proc时定义这些id。查询如下:

CREATE PROCEDURE insert_hh 
@id int
AS
BEGIN
SET IDENTITY_INSERT test_HH ON
INSERT INTO test_HH 
(ID,Beneficiary_Name,Family_Members,
[M_50_yrs],
[F_50_yrs],
[M_50_18],
[F_50_18],
[M_18_15],
[F_18_15],
[M_15_5],
[F_15_5],
[M_5_2],
[F_5_2],
[M_2],
[F_2],
Beneficiary_Status,
Reason_of_Rejection)
SELECT ID,Beneficiary_Name,Family_Members,
[M_50_yrs],
[F_50_yrs],
[M_50_18],
[F_50_18],
[M_18_15],
[F_18_15],
[M_15_5],
[F_15_5],
[M_5_2],
[F_5_2],
[M_2],
[F_2],
Beneficiary_Status,
Reason_of_Rejection 
FROM HH
WHERE ID IN ((@id))
SET IDENTITY_INSERT test_HH OFF
END
现在,我每次只能插入一个ID。你能帮我在同一个进程中插入多个ID吗?
多谢。

将存储过程的@Id参数更改为具有所需长度的VARCHAR

CREATE PROCEDURE insert_hh 
@id varchar(max)
AS
    SET @Id  = '1,10,20,30'
-- temp table
    DECLARE @Id_tbl TABLE (   Id INT )

    INSERT INTO @Id_tbl  
    SELECT 
        LTRIM(RTRIM(split.a.value('.', 'NVARCHAR(MAX)'))) AS fqdn   
    FROM 
        (SELECT 
            CAST ('<M>' + REPLACE(@Id, ',', '</M><M>') + '</M>' AS XML) AS data   ) AS a   
            CROSS APPLY data.nodes ('/M') AS split(a)

    -- INSERT STATEMENT
    SELECT <Fields> FROM
    <Your Table>
    WHERE
        ID IN (SELECT Id FROM @Id_tbl)
END
GO

请注意-参数数据类型已更改。

为什么不多次调用它,在循环中可能会出现这些ID列表?这份名单是永久的吗?不完整的问题。什么是@id。数据类型是什么。有时需要插入大量数据,可能多达数千行。这就是为什么我一直在寻找另一种解决方案,而不是调用proc。我尝试了很多次,但在调用proc无效对象名称“STRING_SPLIT”时出现了此错误。@NisaMelisBirden更新您的问题并指定服务器版本。字符串分割需要兼容级别130 SQL Server 2016。
CREATE PROCEDURE insert_hh 
@id NVARCHAR(MAX)
AS
BEGIN
SET IDENTITY_INSERT test_HH ON

INSERT INTO test_HH 
(ID,Beneficiary_Name,Family_Members,[M_50_yrs],[F_50_yrs],[M_50_18],[F_50_18],
[M_18_15],[F_18_15],[M_15_5],[F_15_5],[M_5_2],[F_5_2],[M_2],[F_2],
Beneficiary_Status,Reason_of_Rejection)

SELECT ID,Beneficiary_Name,Family_Members,[M_50_yrs],[F_50_yrs],[M_50_18],
[F_50_18],[M_18_15],[F_18_15],[M_15_5],[F_15_5],[M_5_2],[F_5_2],[M_2],[F_2],
Beneficiary_Status,Reason_of_Rejection 

FROM HH 
CROSS APPLY STRING_SPLIT(@id, ',') 
WHERE HH.ID = value

SET IDENTITY_INSERT test_HH OFF
END