1

仅仅落后了几年,但我今天发现了存储过程/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 小时的尝试,我认为我需要换一双眼睛来看待它。

4

1 回答 1

0

我相信问题在于你没有从你的函数中返回任何东西,虽然老实说我不确定它是如何在 MGT 工作室中运行的,因为它看起来像一个语法错误。该函数应该看起来像这样

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

您实际使用的语法略有不同的 Id' 图像,并且 select 语句正在执行但函数的返回值没有结果。

于 2012-09-08T14:24:34.157 回答