Как передать ключевое слово по умолчанию для вызова табличных функций в ADO.NET - PullRequest
5 голосов
/ 03 декабря 2009

Так вот в чем дело. В нашей базе данных мы упаковываем большинство наших операций чтения (т.е. операторов выбора) в табличные функции в целях безопасности и модульности. Итак, у меня есть TVF, который определяет один или несколько необязательных параметров.

Я считаю, что наличие TVF с параметрами по умолчанию требует использования ключевого слова default при вызове TVF следующим образом:

select * from fn_SampleTVF(123, DEFAULT, DEFAULT)

Это нормально, все работает в анализаторе запросов, но когда приходит время сделать этот запрос из ADO.NET, я не уверен, как создать параметр sql, который фактически помещает слово default в визуализированный SQL.

У меня сейчас что-то примерно такое:

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)";

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text);

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int);
someRequiredParam.Value = 123;
command.Parameters.Add(someRequiredParam);

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int);
optionalParam.Value = >>>> WTF? <<<<
command.Parameters.Add(optionalParam);

Итак, у кого-нибудь есть идеи, как передать default в TVF?

Ответы [ 3 ]

3 голосов
/ 01 ноября 2010
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int);
optionalParam.Value = >>>> WTF? <<<<
command.Parameters.Add(optionalParam);

Вам не нужно добавлять вышеуказанный код (необязательный параметр) по умолчанию. SQL Server будет использовать значение по умолчанию, как определено в вашей пользовательской функции. Однако, если вы хотите передать другое значение, вы можете передать:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
1 голос
/ 06 декабря 2012

Я бы сделал так:

public void YourMethod(int rparam, int? oparam = null)
{
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})"
        , !oparam.HasValue ? "default" : "@optionalParam");

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int);
    someRequiredParam.Value = rparam;
    command.Parameters.Add(someRequiredParam);

    if (oparam.HasValue)
    {
        SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int);
        optionalParam.Value = oparam.Value;
        command.Parameters.Add(optionalParam);
    }
}
0 голосов
/ 03 декабря 2009

Вы можете передать Null в качестве значения параметра.

В этой статье приведены примеры: http://support.microsoft.com/kb/321902

...