【问题标题】:Passing comma delimited string to stored procedure?将逗号分隔的字符串传递给存储过程?
【发布时间】:2013-11-04 16:15:27
【问题描述】:

我有这个存储过程:

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

【问题讨论】:

  • 标签更改有帮助吗?
  • [dbo] 相当大的暗示它是 mssql。
  • 您确定1,2,3 正在传递到proc 中吗?首先尝试调试您的 C# 代码以确保这是实际值,并且您也可以临时(或永久)修改您的 proc 以便它记录传入的参数值。只是为了确保那里没有任何奇怪的事情发生。
  • 你也可以尝试追踪通过SQL profiler生成的SQL

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


【解决方案1】:

根本不进行拆分。创建一个表值参数并将其传递给您的存储过程。然后更改您的存储过程以加入表值参数。

您的 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 和互联网上有很多使用表值参数的好例子。习惯的好方法。

【讨论】:

  • 谢谢您的回答它现在正在工作,但我会考虑使用这种方法,什么是表值参数?
  • 这是一个可以在 .net 和 sql server 中声明的表,它允许您以您想要的方式传递 ID 列表。在 sql 端,您可以直接加入表。在互联网上查看并找到一些示例 - 我目前正在开展一个经常使用它们的项目,我对它们的易用性感到惊喜。一些警告,但总体上是一个+ve的体验。享受:-)
【解决方案2】:

您可以尝试在 C# 中而不是在 db 级别进行拆分。

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

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

【讨论】:

  • 感谢您现在回复,但我已经整理好了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 2014-10-20
  • 2014-08-23
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多