Сценарий
У меня есть хранимая процедура, которая принимает один параметр. Я хочу обновить эту хранимую процедуру, чтобы получить переменное число параметров - число, которое я никогда не узнаю.
В настоящее время я использую SQLConnections через интерфейс C #, чтобы передать один параметр хранимой процедуре и вернуть результат.
Часть SQL
Допустим, у меня есть хранимая процедура, которая возвращает список результатов на основе одного входного параметра "@ccy" - (Currency). Теперь допустим, что я хочу обновить эту хранимую процедуру, чтобы взять список валют вместо одной, но это число будет переменным в зависимости от ситуации.
Код SQL
ALTER PROCEDURE [dbo].[SEL_BootStrapperInstRICs]
(
@ccy varchar(10)
)
AS
SELECT DISTINCT i.CCY, i.Instrument, i.Tenor, r.RIC, r.[Server], r.RIType
FROM MDR.dbo.tblBootStrapperInstruments as i, MDR.dbo.tblBootStrapperRICs as r
WHERE i.Instrument = r.MurexInstrument
AND
i.Tenor = r.Tenor
AND i.CCY = r.CCY
AND i.CCY = @ccy
AND r.RIType NOT LIKE '%forward%'
Часть C #
Эта конкретная хранимая процедура вызывается из приложения C # WinForms, которое использует метод "SqlCommand.Parameters.AddWithValue ()". Как упоминалось ранее, этот метод в настоящее время передает в качестве параметра для хранимой процедуры одну валюту и возвращает результат в виде набора данных.
public DataSet GetBootStrapperInstRICsDS(List<string> ccys)
{
DataSet ds;
SqlConnection dbConn = null;
SqlCommand dbCmd = new SqlCommand();
try
{
dbConn = GetSQLConnection();
dbCmd = GetSqlCommand();
dbCmd.CommandType = CommandType.StoredProcedure;
dbCmd.CommandText = Utils.Instance.GetSetting ("SELBootStrapInsRics", "default");
foreach(string ccy in ccys)
dbCmd.Parameters.AddWithValue("@ccy", ccy);
dbCmd.CommandTimeout = 600;
dbCmd.Connection = dbConn;
SqlDataAdapter adapter = new SqlDataAdapter(dbCmd);
ds = new DataSet();
adapter.Fill(ds, "tblBootStrapperInstRICs");
dbCmd.Connection.Open();
return ds;
}
catch (Exception ex)
{
ApplicationException aex = new ApplicationException ("GetBootStrapperInstRICsDS", ex);
aex.Source = "Dal.GetBootStrapperInstRICsDS " + ex.Message;
MainForm.job.Log(aex.Source, Job.MessageType.Error);
Job.incurredErrors = true;
throw aex;
}
finally
{
if (dbCmd != null)
dbCmd.Dispose();
if (dbConn != null)
{
dbConn.Close();
dbConn.Dispose();
}
}
}
Вопрос
Что касается C #, я думаю, что мой лучший вариант - использовать цикл foreach / for, чтобы перебирать список параметров и динамически добавлять новый в SPROC. (Я уже сделал это обновление в коде C # выше).
ОДНАКО - Есть ли способ, которым я могу сделать это и в хранимой процедуре SQL? Мои мысли разделены двумя потенциальными вариантами: либо создайте 20 или более параметров в SPROC (каждый с тем же именем, но с возрастающим числом в конце, например, - @ ccy1, @ ccy2 и т. Д.) И используйте «for (int i = 0; я
for(int i=0;i<NumberOfCurrenciesToAdd;i++)
dbCmd.Parameters.AddWithValue("@ccy"+i, currencyArray[i]);
Или другой вариант - сделать что-то совершенно другое, менее мусорное и хакерское. Помощь очень ценится.
РЕДАКТИРОВАТЬ - SQL Server 2005
EDIT2 - должен использовать SPROCS - требование к спецификации компании.