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 は私が作成した型です。これは、nvarchar(256) として定義された val という単一の列を持つテーブル値型です)

次に、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

実際に使用した構文がわずかに異なり、selectステートメントが実行されているが、関数の戻り値に結果がないことを示す画像。

于 2012-09-08T14:24:34.157 に答える