内联T-SQL或子查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内联T-SQL或子查询相关的知识,希望对你有一定的参考价值。

试图找出在内联SQL语句中使用子查询的最有效方法。内联SQL不是我经验丰富的东西,但我在组织中别无选择。

SELECT * 
FROM dbo.VW_RMISPayment
WHERE ProcDate BETWEEN '7/2/2018' AND '3/8/2019' 
  AND Status = 'P' 
  AND Fund = '359' 
  AND Amount > 0 
  AND (BatchNotate = 'B' OR BatchNotate IS NULL)
ORDER BY ProcDate, Amount

我怎么能参数化(BatchNotate = 'B' OR BatchNotate IS NULL)部分?

我的变量作为List<string>传入,但我可以将其改为任何东西。我只是不确定如何从我的变量创建这个子查询

if (BatchNotate.Count() > 0)
{
    query += " AND BatchNotate= @BatchNotate";
}

 cmd.Parameters.AddWithValue("@BatchNotate", batchNotate);
答案

用这个:

BatchNotate = COALESCE(@inVariable,'B')

如果变量(@inVariable)为null,那么它将“默认为B.

如果它是其他东西,它将与之比较。

另一答案

你能做这样的事吗?

SELECT * 
FROM dbo.VW_RMISPayment
WHERE ProcDate BETWEEN '7/2/2018' AND '3/8/2019' 
  AND Status = 'P' 
  AND Fund = '359' 
  AND Amount > 0 
  AND BatchNotate = COALESCE(@BatchNotate, BatchNotate)
ORDER BY ProcDate, Amount
另一答案

这些都不适用于我所追求的目标。这就是我最终做的事情。这有点哈哈,但它确实有效。

 public static string AddParametersOR<T>(SqlParameterCollection parameters,
                                string fieldName,
                                string pattern,
                                SqlDbType parameterType,
                                int length,
                                IEnumerable<T> values)
{
    if (parameters == null)
        throw new ArgumentNullException("parameters");
    if (pattern == null)
        throw new ArgumentNullException("pattern");
    if (values == null)
        throw new ArgumentNullException("values");
    if (!pattern.StartsWith("@", StringComparison.CurrentCultureIgnoreCase))
        throw new ArgumentException("Pattern must start with '@'");

    var parameterNames = new List<string>();
    foreach (var item in values)
    {
        var parameterName = parameterNames.Count.ToString(pattern, CultureInfo.InvariantCulture);
        string parameterWithFieldName = string.Empty;
        if (item.ToString().ToUpper() == "NULL")
        {
            parameterWithFieldName = string.Format("{0} IS NULL", fieldName);
        }
        else if (item.ToString().ToUpper() == "NOTNULL")
        {
            parameterWithFieldName = string.Format("{0} IS NOT", fieldName);
        }
        else
        {
            parameterWithFieldName = string.Format("{0}= {1}", fieldName, parameterName);
        }
        parameterNames.Add(parameterWithFieldName);
        parameters.Add(parameterName, parameterType, length).Value = item;
    }

    return string.Join(" OR ", parameterNames.ToArray());
}

用法:

if (batchNotate.Count() > 0)
 {
    query += " AND ({@BatchNotate})";
 }

string batchNotateParamNames = SqlHelper.AddParametersOR(cmd.Parameters, "BatchNotate", "@B0", SqlDbType.VarChar, 1, batchNotate);

cmd.CommandText = query.Replace("{@BatchNotate}", batchNotateParamNames);

根据列表中的项目数量,输出将如下所示:

(BatchNotate ='B'或BatchNotate ='N'或BatchNotate IS NULL)

如果它找到“NULL”或“NOTNULL”,它将用IS NULL或IS NOT NULL替换它们

以上是关于内联T-SQL或子查询的主要内容,如果未能解决你的问题,请参考以下文章

基础很重要~~04.表表达式

inline内联函数

2C++ 的升级

<code> vs <pre> vs <samp> 用于内联和块代码片段

T-SQL谜题:将表的每一行作为内联函数的输入传递,并使用UNION ALL开发新的堆栈数据集

没有聚合或子查询的查询