Sql server 使用where in语句的SQL存储过程
我正在尝试将数据从一个表插入到另一个表。但我需要在where子句中使用多个特定ID。而且,我需要在运行proc时定义这些id。查询如下: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], [
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