2013-11-04 85 views
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#中传递值时不会返回任何内容?

+1

标签更改对此有帮助吗? – Srb1313711

+2

'[dbo]'很有意思,它是mssql。 –

+1

您未显示从C#调用存储过程的代码。 – Romoku

回答

3

不要做分割。创建一个表值参数并将其传递给存储过程。然后更改存储过程以加入到表值参数中。

你的存储过程将结束这样看:

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和互联网上使用表值参数的好例子。一个适合习惯的好方法。

+0

谢谢你的回答它现在正在工作,但我会看看它使用这种方法,而不是什么是表值参数? – Srb1313711

+1

这是一个可以在.net和sql server中声明的表格,它允许你以你想要的方式传递ID列表。在sql的最后,你可以直接加入表格。看看互联网,找到一些例子 - 我目前正在开发一个项目,使用它们很多,我很惊喜地发现它们很容易使用。一些警告,但总体来说+ +的经验。请享用 :-) – bhs

1

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

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

或者遵循SO关于将数组传递给一个存储过程的例子。无论如何,这可能是你想要做的。

+0

谢谢你现在回复,但我得到它排序 – Srb1313711

相关问题