【问题标题】:SQL Server Pass column name as where clause parameterSQL Server 将列名作为 where 子句参数传递
【发布时间】:2018-07-12 08:24:49
【问题描述】:

如何将列名作为 where 子句参数传递。

     SELECT RP.Saturday,
            RP.Sunday,
            RP.Monday,
            RP.Tuesday,
            RP.Wednesday,
            RP.Thursday,
            RP.Friday,
            RP.SalesMan,
            MC.CustomerID,
            MC.CustomerName
       FROM RoutePlan RP
  FULL JOIN MasterCustomer MC 
         ON RP.CustomerID = MC.CustomerID
      WHERE MC.CreatedBy = 'abc'
        AND RP.Thursday = 1;

我可以从这个查询中得到名字

(Select DATENAME(DW,GETDATE()))

但是我如何将日期名称作为参数(列名)传递。因为日期名称是字符串,搜索变量数据格式是整数,所以查询显示

将 nvarchar 值 'Thursday' 转换为数据类型 int 时转换失败。"

【问题讨论】:

  • 你也可以添加你的 where 子句,eaxcatly 你想怎么发送
  • 添加出现错误的部分
  • 真的不知道你在这里问什么。尝试详细说明并解释您的目标。
  • 您不能在 SQL 中参数化标识符。但是,对我来说,这似乎是一个XYPropblem。请编辑您的问题以将示例数据添加为DDL + DML 和所需的结果。
  • 如果您想从日期名称中获取 int 值,请使用 select {fn DAYOFWEEK( getdate() )}=5

标签: sql sql-server


【解决方案1】:

您可以在逻辑上将参数应​​用于日期名称,如下所示:

DECLARE @day VARCHAR(10) = DATENAME(DW, GETDATE())

SELECT RP.Saturday,
       RP.Sunday,
       RP.Monday,
       RP.Tuesday,
       RP.Wednesday,
       RP.Thursday,
       RP.Friday,
       RP.SalesMan,
       MC.CustomerID,
       MC.CustomerName
FROM RoutePlan RP
     FULL JOIN MasterCustomer MC ON RP.CustomerID = MC.CustomerID
WHERE MC.CreatedBy = 'abc'
  AND (
    (@day = 'Saturday' and RP.Saturday = 1) OR
    (@day = 'Sunday' and RP.Sunday = 1) OR
    (@day = 'Monday' and RP.Monday = 1) OR
    (@day = 'Tuesday' and RP.Tuesday = 1) OR
    (@day = 'Wednesday' and RP.Wednesday = 1) OR
    (@day = 'Thursday' and RP.Thursday = 1) OR
    (@day = 'Friday' and RP.Friday = 1)
  )

使用此示例数据:

CREATE TABLE MasterCustomer(CustomerID int, CustomerName varchar(25), CreatedBy varchar(25))
CREATE TABLE RoutePlan(CustomerID int, Saturday bit, Sunday bit, Monday bit, Tuesday bit, Wednesday bit, Thursday bit, Friday bit, SalesMan varchar(25))

INSERT INTO MasterCustomer (CustomerID, CustomerName, CreatedBy) VALUES (1, 'Customer1', 'abc')
INSERT INTO RoutePlan (CustomerID, Saturday, SalesMan) VALUES (1, 1, 'John')
INSERT INTO RoutePlan (CustomerID, Thursday, SalesMan) VALUES (1, 1, 'Joe')

在星期四运行将返回 1 行,其中 RP.​​Thursday = 1:

Saturday    Sunday  Monday  Tuesday Wednesday   Thursday    Friday  SalesMan    CustomerID  CustomerName
NULL        NULL    NULL    NULL    NULL        1           NULL    Joe         1           Customer1

【讨论】:

  • 就是这样,但仍然需要找到这一天。因为它会每天都在变化。你是天才。更少的解释你得到了学生想要的东西。谢谢你,先生。
  • @NAJEEB 太棒了!我编辑了答案,用当天的名称填充了 day 参数。
【解决方案2】:

这里还有另一种方法,但它取决于服务器上的本地设置,所以你想使用Set DateFirst to 7:

SET DATEFIRST 7;

SELECT RP.Saturday,
       RP.Sunday,
       RP.Monday,
       RP.Tuesday,
       RP.Wednesday,
       RP.Thursday,
       RP.Friday,
       RP.SalesMan,
       MC.CustomerID,
       MC.CustomerName
FROM RoutePlan RP
     FULL JOIN MasterCustomer MC ON RP.CustomerID = MC.CustomerID
WHERE MC.CreatedBy = 'abc'
AND (ISNULL(RP.Saturday, 0) * 1) +
    (ISNULL(RP.Sunday, 0) * 2) +
    (ISNULL(RP.Monday, 0) * 3) +
    (ISNULL(RP.Tuesday, 0) * 4) + 
    (ISNULL(RP.Wednesday, 0) * 5) + 
    (ISNULL(RP.Thursday, 0) * 6) + 
    (ISNULL(RP.Friday, 0) * 7) = DATEPART((weekday,GETDATE());

【讨论】:

    【解决方案3】:

    恕我直言。根据 RDBMS 理念,最好的方法是创建一个引用表,例如 DayOfWeek(dayNum int not null, dayName nvarchar (16) not null) 然后您只需在其中插入所有值并可以在 join 部分的主子句中使用它

    以防万一 - 请记住,并非所有国家/地区都有相同的天数顺序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多