0

私はこのストアドプロシージャを持っています:

ALTER PROCEDURE [dbo].[uspPages_HotelPrices_Lookup_Select] 
    @HotelCode nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM tPages_HotelPrices_Lookup 
    WHERE HotelCode IN (SELECT * FROM DBO.ufSplit(@HotelCode, ',')) 
END

DBO.ufsplitコンマで区切られた文字列を分割し、各行がコンマで区切られた各値を含むテーブルを返します。

以下のコードを使用して、このストアド プロシージャに文字列を渡します。

static void Main(string[] args)
{
    HotelCodesTableAdapter hcTa = new HotelCodesTableAdapter();
    DestinationMarketingEntity.HotelCodesDataTable hotelCodesDt = hcTa.GetData();

    string hotelCodesString = "";
    //Comma separating hotel codes and putting each word in '' to be passed to sql sproc as a list
    for (int i = 0; i < hotelCodesDt.Count; i++)
    {
        hotelCodesString += hotelCodesDt.Rows[i].ItemArray.GetValue(0).ToString() + ",";
    }

    hotelCodesString = hotelCodesString.TrimEnd(',');

    HiltonEEHotelPricesTableAdapter hEETa = new HiltonEEHotelPricesTableAdapter();
    WorldWideFeedEntity.HiltonEEHotelPricesDataTable hEEDt= hEETa.GetData(hotelCodesString);
}

最後の行は、ストアド プロシージャが呼び出されている場所です。

基本的hotelCodesStringには に似て"1,2,3"いますが、これはこのストアド プロシージャから何も返しません。しかし、以下を実行すると:

select * 
from tPages_HotelPrices_Lookup 
  where HotelCode IN 
(
SELECT *
FROM DBO.ufSplit('1,2,3',',')
);

それは私が望むすべてを取り戻します。ここで何か不足していますか?c#で値から渡すときに何も返さないのはなぜですか?

4

2 に答える 2

3

分割は絶対にしないでください。テーブル値パラメーターを作成し、これをストアド プロシージャに渡します。次に、ストアド プロシージャを変更して、テーブル値パラメーターに結合します。

sproc は次のようになります。

CREATE PROCEDURE [dbo].[uspPages_HotelPrices_Lookup_Select] 
    @HotelCodes dbo.MyCodesTable READONLY
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM tPages_HotelPrices_Lookup a 
    INNER JOIN @HotelCodes b ON (a.ID = b.ID)
END

SO とインターネットでテーブル値パラメーターを使用する良い例がたくさんあります。慣れるには良い方法です。

于 2013-11-04T16:41:29.057 に答える