在WHERE子句中使用varchar局部变量

时间:2018-04-22 04:00:54

标签: sql sql-server

我正在使用SQL服务器进行此查询...我将创建几个SELECT语句,它们将使用WHERE子句的相同部分。到目前为止,我已声明一个vachar变量包含在WHERE子句中,但我收到一个错误。这是我到目前为止所尝试的:

DECLARE @PersonalLoans varchar(500) = 'code = ''RTR'' OR 
code = ''RTL'' OR 
code = ''LRV'' OR 
code = ''LPV'' OR 
code = ''LN'' OR 
code = ''LFR'' OR 
code = ''LCV'''

DECLARE @L01 int = 0
SELECT @L01 = ROUND(SUM(balance)*-1,2) FROM loan WHERE @PersonalLoans AND paydue > @databasedate      
PRINT '"L01": ' + CAST(@L01 AS varchar(15)) + ';'

我在WHERE子句中收到错误: 在期望条件的上下文中指定的非布尔类型的表达式。

我做了一些研究并遇到了EXEC函数,但我需要能够将“AND paydue> @databasedate”添加到WHERE子句中。我需要多次使用@PersonalLoans变量,并在整个查询中为它添加不同的AND子句。

2 个答案:

答案 0 :(得分:2)

一般情况下,如果没有EXECUTE或类似内容,

>就无法工作。

但你很幸运。这些多个OR可以简化为

code IN ('RTR',
         'RTL', 
         'LRV', 
         'LPV', 
         'LN', 
         'LFR', 
         'LCV')

。接下来您可以使用表格变量将代码推入并将其用作IN的列表:

DECLARE @codes
        TABLE (code varchar(3));
INSERT INTO @codes
            VALUES ('RTR'),
                   ('RTL'), 
                   ('LRV'), 
                   ('LPV'), 
                   ('LN'), 
                   ('LFR'), 
                   ('LCV');

DECLARE @L01 int = 0;
SELECT @L01 = round(sum(balance) * -1, 2)
       FROM loan
       WHERE paydue > @databasedate
             AND code IN (SELECT code
                                 FROM @codes);
PRINT '"L01": ' + cast(@L01 AS varchar(15)) + ';';

因此,通过在表变量中插入更多代码,可以轻松扩展(我猜这是你的方法背后的原因)。

答案 1 :(得分:0)

您可以将要在重载中重用的WHERE子句放入,然后执行动态SQL以将WHERE子句变量与您拥有的任何其他WHERE条件组合(例如AND paydue > @databasedate)。尝试这样的事情:

EXEC sp_executesql
    'SELECT whatever ' +
    'FROM whoever ' +
    @WhereClause + -- Your @PersonalLoans variable(?)
    'AND paydue > ' + @databasedate