【发布时间】:2021-03-08 11:43:49
【问题描述】:
CREATE TABLE EAddressDetails (EAddress varchar(100) NULL))
CREATE TYPE EAddressList AS TABLE (Email VARCHAR(100)))
CREATE PROCEDURE EAddresses_InsertBatch
@EAddressBatch [EAddressList] READONLY
AS
BEGIN
INSERT INTO EAddressDetails (EAddress)
SELECT E.Email FROM @EAddressBatch E
SELECT EAddress
from EAddressDetails
END;
像下面这样执行上面的存储过程
DECLARE @__sp_result int; DECLARE @EAddressBatch EAddressList;
INSERT INTO @EAddressBatch(EAddress)
SELECT EAddress FROM (VALUES (?),(?)...2000 rows,(?)) s(EAddress);
EXECUTE @__sp_result = EAddresses_InsertBatch @EAddressBatch=@EAddressBatch;
SELECT @__sp_result AS __sp_result;
The incoming request has too many parameters. The server supports a maximum of 2100 parameters. Reduce the number of parameters and resend the request.: S0001
有没有什么有效的方法可以插入超过2100个参数。
【问题讨论】:
-
看来您最好在这里进行 BULK 操作。
-
hmm.. 但是设置是使用 TVP。 :(
-
不确定我的查询在这里是否有效
-
您在 EAddressDetails 上有插入触发器吗?它是否试图在
inserted虚拟表上使用IN运算符? -
将电子邮件地址作为应用代码中的表值参数传递,而不是单个标量参数。这将更加高效,避免插入表变量,并避免 2100 参数限制。 T-SQL 代码为
DECLARE @__sp_result int;EXECUTE @__sp_result = EAddresses_InsertBatch @EAddressBatch=?;SELECT @__sp_result AS __sp_result;
标签: sql-server stored-procedures jdbc mssql-jdbc table-valued-parameters