bmw318mt Ответов: 2

Порядковые значения в клиенте C# SQL


У меня есть функция
GetStudents
, который принимает два параметра. Я хочу использовать порядковые значения для выбора, но получаю ошибку. Если мне удастся это сделать, то я попытаюсь добавить предложение where in, что условия меняются, поэтому мне нужно использовать порядковые значения.

using (SqlCommand cd = db.CreateCommand())
                    {
                        cd.CommandType = CommandType.Text;
                        cd.CommandText = "SELECT ClassName FROM GetStudents(?,?)";
                        cd.Parameters.AddWithValue(null, age);
                        cd.Parameters.AddWithValue(null, monthBday);
}


Что я уже пробовал:

<pre>using (SqlCommand cd = db.CreateCommand())
                    {
                        cd.CommandType = CommandType.Text;
                        cd.CommandText = "SELECT ClassName FROM GetStudents(?,?)";
                        cd.Parameters.AddWithValue(null, age);
                        cd.Parameters.AddWithValue(null, monthBday);
}

2 Ответов

Рейтинг:
5

#realJSOP

Я думаю, что ваш подход совершенно неверен. Вы можете вычислить их возраст с помощью некоторого математического кода SQL date. Кроме того, ваша функция GetStudents даже не должна существовать. Любой запрос, содержащийся в функции, может быть помещен в запрос, вызывающий эту функцию. Вызов функции в запросе очень дорог с точки зрения производительности, и его следует избегать, если это возможно. Итак, предположим, что вам нужно имя класса для всех учащихся определенного возраста:

SELECT [ClassName] 
FROM Students 
WHERE @age = DATEDIFF(YEAR, CONVERT(DATE,GETDATE()), CONVERT(DATE,[DateOfBirth]))


Richard Deeming

"Вызов функции в запросе очень дорог с точки зрения производительности, и его следует избегать, если это возможно."

Правда для скалярной функции или нескольких функций; но встроенной возвращающей табличное значение функции, как правило, имеет такую же производительность, как положить весь встроенных запросов.

Рейтинг:
12

Richard Deeming

SQL использует именованные параметры. Для вызова функции имена параметров не обязательно должны совпадать с именами, объявленными в функции:

cd.CommandText = "SELECT ClassName FROM GetStudents(@p0,@p1)";
cd.Parameters.AddWithValue("@p0", age);
cd.Parameters.AddWithValue("@p1", monthBday);


bmw318mt

Да, как это работает, теперь, если я хочу добавить, где "страна", но названия округов могут измениться, как мне это сделать?

Выберите имя класса из GetStudents(?,?) where country in ('USA', 'UK')

Richard Deeming

string[] countries = { "USA", "UK" };
string[] parameterNames = countries.Select((_, i) => "@C" + i).ToArray();

cd.CommandText = string.Format(
    "SELECT ClassName FROM GetStudents(@p0,@p1) WHERE country In ({0})",
    string.Join(", ", parameterNames));

// ==> "SELECT ClassName FROM GetStudents(@p0,@p1) WHERE country In (@C0, @C1)"

cd.Parameters.AddWithValue("@p0", age);
cd.Parameters.AddWithValue("@p1", monthBday);

for (int index = 0; index < countries.Length; index++)
{
    cd.Parameters.AddWithValue(parameterNames[index], countries[index]);
}