繁体   English   中英

来自C#的SQL表值参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM