簡體   English   中英

SQL Server傳遞列名作為where子句參數

[英]SQL Server Pass column name as where clause parameter

如何將列名作為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值“星期四”轉換為數據類型int時,轉換失敗。”

您可以像這樣在邏輯上將參數應​​用於日期名稱:

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

這是另一種方法,但是取決於服務器上的本地設置,因此您要使用Set DateFirst為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());

恕我直言。 按照RDBMS理念的最好辦法是創建實例的引用的表DayOfWeek(dayNum int not null, dayName nvarchar (16) not null)然后你只需插入那里所有的值,並可以在使用它的一個主句join部分

並且以防萬一-請記住,並非所有國家/地區的計數天數都相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM