使用 T-SQL 中的一个参数将多个值插入多行

Posted

技术标签:

【中文标题】使用 T-SQL 中的一个参数将多个值插入多行【英文标题】:Insert multiple values into multiple rows using one parameter in T-SQL 【发布时间】:2016-04-19 15:16:32 【问题描述】:

我正在构建一个应用程序,使用 Microsoft Access 作为前端,使用 SQL Server 作为后端。

我有一个插入客户信息的存储过程。将为每个客户插入的信息之一是他们的信用卡号。每个客户的信用卡数量可能在 1-50 之间。

我打算在 VBA 中使用动态数组来添加信用卡号。我遇到的麻烦是我不太确定如何将值传递给存储过程。

我的第一个想法是创建大量参数(CC 编号 1、CC 编号 2、CC 编号 3 等),但显然这不是正确的方法。

将信用卡号添加到动态数组后,我可以重新调整它以计算需要插入多少个信用卡号。

将 14 个信用卡值传递给一个参数并将每个值作为新行插入的最佳方法是什么?

【问题讨论】:

表值参数? msdn.microsoft.com/en-us/library/bb510489.aspx @Kritner:但是如何从 Access 中调用它? - 如果必须使用存储过程,我可能会将它们连接在一起并作为一个分隔字符串传递。然后使用您选择的Split function 提取它们。但实际上我宁愿直接从 Access 插入行。 @Andre 如何将每个拆分值作为新记录插入到 SQL Server 中?我正在考虑在 Access For Each....value in array execute stored procedure next 中做这样的事情虽然我觉得有更好的方法来做到这一点。 我的意思是,我不会将此作为存储过程的一部分,因此不会加入或拆分。您在某个地方收集这些 CC 编号,然后我会从那里直接将它们插入到表中(执行 INSERT 语句或使用 DAO)。 @AdibAkale 如果您的问题已得到解答,请接受答案。如果没有,请让使用知道您仍然缺少什么:) 【参考方案1】:

不幸的是,AFAIK,VBA 不支持表值参数(ADO.NET 支持,但不支持我们必须在 Access 中使用的 vanilla VB6 实现)。

您可以通过循环记录集或其他方式向服务器发送函数调用流,但这会非常缓慢。但是,如果您不介意重复自己,您可以发送一个包含一堆 EXEC 语句的大命令一个接一个地链接(如果您使用的是 DAO,请务必在开头指定 SET NOCOUNT ON查询)。

如果您正在寻找纯 SQL 解决方案,以下是我针对此类问题采取的策略:

使用某种分隔符(例如“,”或“|”)将值数组连接成一个字符串。 将字符串传递给将其转换为值表的函数或查询。 INSERTMERGE 将值表放入最终目标表中。

下面是一个例子:

SET NOCOUNT ON

DECLARE @x XML;
DECLARE @CreditCards AS TABLE (CreditCardNumber VARCHAR(16));
DECLARE @FinalTable AS TABLE (CreditCardNumber VARCHAR(16));
DECLARE @CreditCardList AS VARCHAR(8000);
DECLARE @Divider AS Varchar(10);

SET @Divider=',';
SET @CreditCardList='1234567890123456,1111111111111111,2222222222222222,123456789012345';

IF NOT @CreditCardList IS NULL 
  BEGIN 
    SELECT @x = CAST('<A>'+ REPLACE(@CreditCardList,@Divider,'</A><A>')+ '</A>' AS XML);
    INSERT INTO 
      @CreditCards            
    SELECT 
      t.value('.', 'varchar(16)') AS inVal
    FROM 
      @x.nodes('/A') AS x(t) ;
  END 

INSERT INTO 
  @FinalTable
SELECT 
  CreditCardNumber
FROM
  @CreditCards 

SELECT * FROM @FinaLTable

XML 不是进行转换的最快方式,但它的好处是相对简单。 Jeff Moden 在他的博文Tally OH! An Improved SQL 8K “CSV Splitter” Function 中提供了几个非常有启发性的方法来解决这个问题。

希望有帮助!

【讨论】:

【参考方案2】:

使用 XML 在一个文档中传递所有客户信息。通过这种方式,您可以传递任意数量的参数并在服务器上将其作为表进行查询。

【讨论】:

以上是关于使用 T-SQL 中的一个参数将多个值插入多行的主要内容,如果未能解决你的问题,请参考以下文章

使用T-SQL语句操作数据表-插入数据

使用 Excel VBA 将多个值插入连接查询

入门Mysql命令总结!!!

如何使用序列值将多行插入到 oracle 中?

将php表单中的多行插入数据库

从文件中读取多行中的多个值(Java)