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

标签 c# sql-server

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

claim 数据

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 TYPE,如下所示

表格类型

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 

关于c# - 如何将 <List> 数组传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21794706/

相关文章:

c# - 内存泄漏和局部变量

c# - 为构造函数参数设置契约

c# - 如何使用 EC2 api 来判断实例状态?

sql - 如何在没有额外 XML 开销的情况下在 T SQL 中对 XML 进行编码

sql-server - 带有 Bonobo GIT 的 SQL 服务器

sql-server - 德语元音变音哈希 - SQL Server 上的 SHA256

sql-server - 如何避免ms-sql select语句中被0除?

c# - 如何使用 json.stringify 将对象列表从 View 传递到 MVC Controller

c# - 从对象类型WebMatrix.Data.DynamicRecord到已知托管提供程序 native 类型的映射不存在

c# - 如何创建一个 nuget 包,将文件复制到消费者的构建输出