将逗号分隔的字符串传递给存储过程?

时间:2013-11-04 16:15:28

标签: c# sql-server-2008 visual-studio

我有这个存储过程:

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#传递值时不会返回任何内容?

2 个答案:

答案 0 :(得分: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和互联网上使用表值参数有很多很好的例子。一个习惯的好方法。

答案 1 :(得分:1)

您可以尝试在C#中进行拆分,而不是在数据库级别进行拆分。

 string[] m_separators = new string[] { "," };
 string[] m_stringarray = somestring.Split(m_separators, StringSplitOptions.RemoveEmptyEntries);

或者按照SO上关于将数组传递给存储过程的示例进行操作。无论如何,这可能是你想要做的。