【问题标题】:CLR SQL User Defined type pass list of ID to stored procedureCLR SQL 用户定义类型将 ID 列表传递给存储过程
【发布时间】:2012-12-05 23:19:27
【问题描述】:

在项目中,我们多次将 ID 列表从 UI 传递到存储过程。大多数解决方案都基于创建 sql 字符串拆分函数,该函数创建临时表并使用临时表执行一些内部连接器。等等

有没有人有创建CLR SQL UDT的经验一些我们可以传递给用户proc的StringList

StringList stringList = new StringList();
stringList.Add("ID1");
stringList.Add("ID2");
stringList.Add("ID3");
SqlCommand cmd = new SqlCommand("SelectDataByIDs");
cmd.Parameters.Add(new SqlParameter("list", SqlDbType.Udt){ Value = stringList});

并在 SQL 中使用

SELECT * FROM DataTable 
WEHRE DataId in @stringList -- or inner join?

请分享你的智慧

【问题讨论】:

标签: c# tsql ado.net sqlclr


【解决方案1】:

这是我为我的案例所做的:

--declare type
CREATE TYPE StringIDList AS TABLE
(   StringId NVARCHAR(8) NOT NULL PRIMARY KEY )
go
--test function
CERATE PROCEDURE SelectListValue
(   @ids [dbo].[StringIDList] readonly )
AS
BEGIN
    SELECT * FROM @ids WHERE StringId <> '30'
END

C#代码

SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS2012;Initial
Catalog=db;Integrated Security=true");
conn.Open();

List<SqlDataRecord> records = new List<SqlDataRecord>();
var rec = new SqlDataRecord(new SqlMetaData("stringid", SqlDbType.NVarChar, 8));
rec.SetValue(0, "10");
records.Add(rec);

rec = new SqlDataRecord(new SqlMetaData("stringid", SqlDbType.NVarChar, 8));
rec.SetValue(0, "30");
records.Add(rec);

var cmd = new SqlCommand("SelectListValue");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;

var param = new SqlParameter("@ids", SqlDbType.Structured);
param.Direction = ParameterDirection.Input;
param.TypeName = "StringIDList";
param.Value = records;

cmd.Parameters.Add(param);

var reader = cmd.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine(reader.GetString(0));
}

控制台输出

10

看起来很简单……你觉得呢?

【讨论】:

  • 很好的答案!谢谢
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多