来自C#的SQL表值参数

时间:2012-09-07 11:20:32

标签: c# tsql

仅落后几年,但我今天发现了存储过程/ 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个小时的尝试,我想我需要一套新的眼睛才能看到它。

1 个答案:

答案 0 :(得分: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语句正在执行,但函数的返回值没有结果。