[英]SQL Table valued parameters from C#
仅仅落后了几年,但是今天我发现了存储过程/ 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个小时的尝试,我认为我需要换一组新的眼睛进行观察。
我认为问题在于您没有从函数中返回任何内容,尽管说实话,我不确定它如何在MGT studio中运行,因为它看起来像语法错误。 该函数应如下所示
CREATE FUNCTION GetSurveyScores (
@Survey bigint,
@Question nvarchar(max),
@Area StringList READONLY,
@JobCodes StringList READONLY )
RETURNS @Results TABLE (RespondentArea NVARCHAR(256), RespondentJobCode NVARCHAR(256))
AS
BEGIN
INSERT @Results
SELECT * FROM SurveyResults WHERE RespondentArea IN (Select val from @Area) AND RespondentJobCode IN (select val from @JobCodes)
RETURN
END
go
可以看到,您实际使用的语法略有不同,并且正在执行select语句,但是该函数的返回值没有结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.