0

プロジェクトでは、ID のリストを UI からストアド プロシージャに渡すことがよくあります。ほとんどのソリューションは、一時テーブルを作成し、一時テーブルでいくつかの内部結合を実行する SQL 文字列分割関数の作成に基づいています。ら

ユーザー プロシージャに渡すことができる CLR SQL UDT いくつかの 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?

あなたの知恵を分けてください

4

1 に答える 1

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

かなりまっすぐに見えます...どう思いますか?

于 2012-12-05T15:19:27.447 に答える