2012-09-07 29 views
1

仅仅落后了几年,但我今天发现了存储过程/ UDF的表值参数。他们是我遇到的问题的理想解决方案,但我无法让他们从C#工作。来自C#的SQL表值参数

我有一个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管理工作室,我可以这样做:

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#,我没有得到任何结果(无例外),使用此代码:(我使用的数据表,因为实际的代码,我打算放到这里采用的数据表的话)

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

'WHERE RespondentArea IN(@Area)'应该是'WHERE RespondentArea IN(SELECT val FROM @Area)'? –

+0

是的,错过了那一点。事情就是这样。现在更正。 – Neil

+0

对于职位代码和区域数据表,您将在单引号中添加行值而不是双引号。 – Divi

回答

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语句,但该函数的返回值,一直没有结果。