select *
from
Customers
where
[email protected]
AND (city = @City
OR ISNULL(@City,'') = '')
Я бы порекомендовал вышесказанное, что вы можете сделать это в 1 инструкции выбора без использования методов управления ПЧ. Он будет проверять город, но он также скажет, что если @City пуст, тогда верните его в любом случае, потому что только одно из этих условий может быть истинным в то время, когда вы никогда не закончите получать результаты, которых вы не хотите. Для того, чтобы использовать метод управления вы могли бы сделать что-то вроде следующего,
IF ISNULL(@City,'') <> ''
BEGIN
select * from Customers where city = @City and [email protected];
END
ELSE
BEGIN
select * from Customers where [email protected];
END
Но опять-таки первый пример будет больше стандартного и меньше кода, так что я бы рекомендовал.
Редактировать: Вы должны передавать параметр каждый раз. В противном случае вы действительно измените инструкцию SQL в коде C#, а не в коде SQL.
Далее вы фактически передадите пустую строку НЕ значение NULL, глядя на ваше назначение var city = "";
, чтобы вы могли переключиться на тест для этого.
Проблема с НЕ передавая параметр вообще - ваш оператор SQL будет использовать переменную, которую вы не объявили, если вы не добавляете значение параметра. Таким образом, стандартный способ заключается в том, чтобы всегда передавать переменную и использовать оператор SQL, такой как первый выше. ЕСЛИ вы действительно хотите сделать это по-другому, чтобы даже не пройти вообще, вам нужно будет использовать поток управления C# для создания вашей строки SQL по-разному.
Стандартный способ:
var city = "";
var state = "tx";
var sqlQuery = "
select *
from
Customers
where
[email protected]
AND (city = @City
OR ISNULL(@City,'') = '')
";
var conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
conn.Open();
SqlCommand cmd = new SqlCommand(sqlQuery, conn);
SqlParameter param = new SqlParameter();
param.ParameterName = "@City";
param.Value = city;
cmd.Parameters.Add(param);
SqlParameter param = new SqlParameter();
param.ParameterName = "@State";
param.Value = state;
cmd.Parameters.Add(param);
var reader = cmd.ExecuteReader();
способ сделать это без прохождения параметра, чтобы динамически создавать свой SQL заявление через поток C# управления:
var city = "";
var state = "tx";
var sqlQuery = "
select *
from
Customers
where
[email protected]
";
if (!string.IsNullorEmpty(city))
{
sqlQuery += "
AND [email protected]";
}
var conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
conn.Open();
SqlCommand cmd = new SqlCommand(sqlQuery, conn);
if (!string.IsNullorEmpty(city))
{
SqlParameter param = new SqlParameter();
param.ParameterName = "@City";
param.Value = city;
cmd.Parameters.Add(param);
}
SqlParameter param = new SqlParameter();
param.ParameterName = "@State";
param.Value = state;
cmd.Parameters.Add(param);
var reader = cmd.ExecuteReader();
Чтобы расширить немного больше о том, почему вы получили must declare scalar variable @city
, когда вы не прошли параметр, потому что определение параметра в C# является тем, что определяет переменную в SQL.Итак:
SqlParameter param = new SqlParameter();
param.ParameterName = "@City";
param.Value = city;
cmd.Parameters.Add(param);
По сути делает это в SQL:
DECLARE @City VARCHAR(50)
SET @City = value of city var.
Итак, если вы пропустите этот шаг, как вы делаете, используя, если поток управления по городу вар опустить определение переменной и SQL потерпит неудачу , Таким образом, хотя значение параметра может быть необязательным, сам параметр НЕ является опцией, если он ссылается на ваш SQL-оператор.
Также обратите внимание, что вы используете неявные типы данных в определениях параметров, которые вы действительно должны явно определять тип данных!
Почему вы не можете использовать хранимую процедуру? Это странное ограничение. –
Согласен. Моя работа наложила на меня наручники. Мы используем все встроенные sql. Я не уверен, что это возможно, чего они хотят – BoundForGlory
Это абсолютно возможно. См. Мой ответ. Мне плохо, если вы работаете с такими абсурдными ограничениями. Я слышал об этом раньше, и это всегда сводится к тому, кто дезинформирован и в состоянии сделать такие широкие мандаты. Хуже всего то, что тот же человек также обычно мертв в своих ошибочных убеждениях и отказывается слушать разум. Вам либо приходится иметь дело с такой глупостью или очищать свое резюме. –