如何将数组传递给<List>存储过程



我有一个 C# 中的 ClaimData 列表,它有三个项目 日期、类型和描述其中可以有多个行,如下所示,

索赔数据

Date         Type      Description
01/02/2012  "Medical" "Its a medical"
05/02/2013  "Theft"   "Its a Theft"
01/02/2014  "Test"    "Its a Test"

我想一次性将整个数据传递给 sql 服务器的存储过程,以便减少数据库命中。我编写了可以循环访问此列表并将它们插入表中的存储过程。

如何通过操作列表对象作为参数传递给存储过程来实现?

您需要做几件事才能实现此目的,因为您的参数正在获取多个值,因此您需要创建一个表类型并使存储过程接受该类型的参数。

由于您要传递TABLE作为参数,因此您需要创建一个 TABLE 类型,如下所示

表类型

CREATE TYPE dbo.ClaimData AS TABLE 
 (
    [Date]         DATE
    [Type]         VARCHAR(50)
    [Description]  VARCHAR(100)
  )
 GO

接受该类型参数的存储过程

 CREATE PROCEDURE mainValues 
 @TableParam ClaimData READONLY   --<-- Accepts a parameter of that type 
 AS                                  -- Note it is ReadOnly 
 BEGIN
    SET NOCOUNT ON;
  --Temp table to store the passed values 
  -- since the passed parameter is only Read only and you
  -- cannot make any changes to the parameter so if you need to
  -- manipulate the data inside parameter you will need to get it
  -- into a Table vaiable.

  -- Declare a Table variable
  DECLARE @tmp_values table(
          [Date]         DATE
          [Type]         VARCHAR(50)
          [Description]  VARCHAR(100)
                            );   
   --Get values into that Table variable 
   INSERT INTO @tmp_values ([Date],[Type],[Description])
   SELECT [Date],[Type],[Description] FROM @TableParam
   -- Do other cool stuff with your passed data 
   SELECT * FROM @tmp_values  --<-- For testing purpose
END

执行进程

声明该类型的变量,并用您的值填充它。

 DECLARE @Table ClaimData(      --<-- Declare a variable of your type
          [Date]         DATE
          [Type]         VARCHAR(50)
          [Description]  VARCHAR(100)
                            ); 
 -- Populate the variable
   INSERT INTO @Table ([Date],[Type],[Description])
   SELECT [Date],[Type],[Description] FROM Source_Table
EXECUTE mainValues @Table   --<-- Stored Procedure Executed 

我使用字符串生成器和分量仪"|"将所有三列作为字符串发送

    DateString = '01/02/2012|05/02/2013|01/02/2014'
    TypeString = 'Medical|Theft|Test'
    DescString = "Its a medical|..."

在数据库端,我使用了一个函数来分隔这些字符串,并将所有这些值插入到临时表中。这解决了我的问题。

最新更新