我从我的C#代码调用SQL Server存储过程:
using (SqlConnection conn = new SqlConnection(connstring))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("InsertQuerySPROC", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
var STableParameter = cmd.Parameters.AddWithValue("@QueryTable", QueryTable);
var NDistanceParameter = cmd.Parameters.AddWithValue("@NDistanceThreshold", NDistanceThreshold);
var RDistanceParameter = cmd.Parameters.AddWithValue(@"RDistanceThreshold", RDistanceThreshold);
STableParameter .SqlDbType = SqlDbType.Structured;
NDistanceParameter.SqlDbType = SqlDbType.Int;
RDistanceParameter.SqlDbType = SqlDbType.Int;
// Execute the query
SqlDataReader QueryReader = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
我的存储过程是相当标准的但是加入了QueryTable(因此需要使用存储过程).
现在:我想List<string>在参数集中添加一个字符串列表.例如,我的存储过程查询如下所示:
SELECT feature
FROM table1 t1
INNER JOIN @QueryTable t2 ON t1.fid = t2.fid
WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
Run Code Online (Sandbox Code Playgroud)
但是,字符串列表是动态的,几百长.
有没有办法将字符串列表传递List<string> …
我已经看到了许多不同的方法来创建和填充数字表.但是,创建和填充一个的最佳方法是什么?从最重要到最不重要的"最佳"被定义:
如果你不知道数字表是什么,请看这里:我为什么要考虑使用辅助数字表?
我试图List< int>使用此代码作为SQL参数:
var listID= new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
using (var sqlConnection = new SqlConnection(_connectionstring))
{
using (var cmd = new SqlCommand())
{
cmd.Connection = sqlConnection;
cmd.CommandText = "delete from MyTable where TableID in ( @tableID)";
string param = String.Join(",", listID.ToArray());
cmd.Parameters.Add("@tableID", param);
sqlConnection.Open();
cmd.ExecuteNonQuery();
}
sqlConnection.Close();
}
Run Code Online (Sandbox Code Playgroud)
问题是,此代码将生成:
exec sp_executesql来自MyTable的N'delete,其中TableID位于(@tableID)',N'@ tableID nvarchar(17)',@ tableID = N'1,2,3,4,5,6,7,8,9'
这将失败,因为:
将nvarchar值'1,2,3,4,5,6,7,8,9'转换为数据类型int时转换失败.
不知道怎么解决这个问题?谢谢.
编辑:我正在使用MS SQL 2012