仅仅落后了几年,但我今天发现了存储过程/UDF 的表值参数。它们是我遇到的问题的理想解决方案,但我无法让它们在 C# 中工作。
我有一个UDF:
CREATE FUNCTION GetSurveyScores
@Survey bigint,
@Question nvarchar(max),
@Area StringList READONLY,
@JobCode StringList READONLY
AS BEGIN
SELECT * FROM SurveyResults WHERE RespondentArea IN (Select val from @Area) AND RespondentJobCode IN (select val from @JobCodes)
END
(StringList 是我创建的类型,它只是一个表值类型,有一个名为 val 的列,定义为 nvarchar(256))
然后从 SQL Server Management Studio,我可以这样做:
declare @area StringList;
insert into @area(val) values('NW'),('NE'),('SW');
// Get all survey respondent job codes from the SurveyRespondent table.
declare @jobcodes StringList;
insert into @jobcodes select distinct jobcode from dbo.SurveyRespondent;
select * from dbo.GetSurveyScores(3, 'Q3', @area, @jobcodes)
这非常有效。
从 C# 中,我没有得到任何结果(没有例外),使用此代码:(我正在使用 DataTables,因为我打算将其放入的实际代码已经使用 DataTables)
DataTable areas = new DataTable("StringList");
areas.Columns.Add("val");
areas.Rows.Add("NW"); areas .Rows.Add("NE"); areas .Rows.Add("SW");
DataTable jobcodes = new DataTable("StringList");
jobcodes.Columns.Add("val");
jobcodes.Rows.Add("JC1"); jobcodes .Rows.Add("JC2");
SqlCommand cmd = new SqlCommand("SELECT * FROM dbo.GetSurveyScores(3, 'Q3', @area, @jc)", connection);
cmd.Parameters.AddWithValue("@area", areas);
cmd.Parameters["@area"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@area"].TypeName = "StringList";
cmd.Parameters.AddWithValue("@jc", jobcodes);
cmd.Parameters["@jc"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@jc"].TypeName = "StringList";
DataTable results = new DataTable();
using (SqlDataAdapter da = new SqlDataAdapter(cmd)) {
da.Fill(results);
}
Console.WriteLine(results.Rows.Count);
最后一行打印 0。我确定我一定错过了一些简单的东西,但经过 6 小时的尝试,我认为我需要换一双眼睛来看待它。