Dynamic-SQL: выражение не булевого типа, указанное в контексте, где ожидается условие, рядом с ',' - PullRequest
0 голосов
/ 03 мая 2018

Я получаю сообщение об ошибке при попытке запустить следующий SQL. Я пытаюсь запустить динамический запрос с несколькими различными параметрами. Будем весьма благодарны за любые советы и предложения.

/* ----- For Testing ----- */
DECLARE @StartDate NVARCHAR(10) = '04/01/2018',
        @EndDate NVARCHAR(10) = '04/01/2018',
        @Location NVARCHAR(MAX) = 'Newcastle, Salt Creek',
        @DayType NVARCHAR(20) = 'Calendar',
        @SQL NVARCHAR(MAX)

SELECT @SQL = 'SELECT S.SiteCode,
        S.Name AS Site_Name,
        L.Name,
        DATEADD(HOUR, (T.Period) + 1, P.DateData) AS PeriodEnding,
        SUM(T.Ins) AS SumOfIns,
        SUM(T.Outs) AS SumOfOuts
FROM dbo.Location L
    INNER JOIN dbo.Traffic T ON L.ID = T.LocationID
    INNER JOIN dbo.Publish P ON T.PublishID = P.ID
    INNER JOIN dbo.Site S ON P.SiteID = S.ID
WHERE ((P.DateData) BETWEEN '+ @StartDate +' AND '+ @EndDate +')
    AND T.Ins > -1
    AND ((T.EditSequence) = 0)
    AND ((P.CanPublish) = 1)
    AND L.IsActive = 1
    AND (L.IsInternal = 0 OR L.IsInternal IS NULL)
    AND S.CustomerID = 1
    AND S.Name in (''' + REPLACE(@Location,',',''',''') + ''')
    AND ('+ @DayType +' = ''Calendar'')
    OR  ('+ @Location +' IN (LT.Name) AND '+ @DayType +' = ''Business'' AND (T.Period between 7 and 17))
GROUP BY S.SiteCode,
    S.Name,
    L.Name,
    DATEADD(HOUR, (T.Period)+1, P.DateData)
ORDER BY S.SiteCode,
        S.Name,
        L.Name,
        DATEADD(HOUR, (T.Period)+1, P.DateData)';

EXEC sp_executesql @sql

Еще раз спасибо за всю помощь. Мой код теперь выглядит так ...

DECLARE @StartDate NVARCHAR(10) = '04/01/2018',
@EndDate NVARCHAR(10) = '04/01/2018',
@Location NVARCHAR(MAX) = 'Salt Creek,Madill',
@DayType NVARCHAR(12) = 'Calendar',
@SQL NVARCHAR(MAX)

SELECT @SQL = '     
SELECT S.SiteCode,
S.Name AS Site_Name,
L.Name,
DATEADD(HOUR, (T.Period) + 1, P.DateData) AS PeriodEnding,
SUM(T.Ins) AS SumOfIns,
SUM(T.Outs) AS SumOfOuts
FROM dbo.Location L
    INNER JOIN dbo.Traffic T ON L.ID = T.LocationID
    INNER JOIN dbo.Publish P ON T.PublishID = P.ID
    INNER JOIN dbo.Site S ON P.SiteID = S.ID
WHERE ((P.DateData) BETWEEN '''+ CONVERT(NVARCHAR, @StartDate, 109) +''' AND '''+ CONVERT(NVARCHAR, @EndDate, 109) +''')
    AND T.Ins > -1
    AND ((T.EditSequence) = 0)
    AND ((P.CanPublish) = 1)
    AND L.IsActive = 1
    AND (L.IsInternal = 0 OR L.IsInternal IS NULL)
    AND S.CustomerID = 1
    AND LTRIM(S.Name) in (''' + REPLACE(@Location,',',''',''') + ''')
    AND '+ @DayType +' = ''Calendar''
    OR (S.Name in (''' + REPLACE(@Location,',',''',''') + ''') AND '+ @DayType +' = ''Business'' AND T.Period between 7 and 17)
GROUP BY S.SiteCode,
    S.Name,
    L.Name,
    DATEADD(HOUR, (T.Period)+1, P.DateData)
ORDER BY S.SiteCode,
    S.Name,
    L.Name,
    DATEADD(HOUR, (T.Period)+1, P.DateData)';
print @sql

CREATE TABLE #DailyTracking  (Site_Code INT, Site_Name VARCHAR(50), Location_Name VARCHAR(50), PeriodEnding DATE, SumOfIns INT, SumOfOuts INT)
INSERT INTO #DailyTracking EXEC sp_executesql @sql

SELECT * FROM #DailyTracking

DROP TABLE #DailyTracking

Я получаю сообщение об ошибке - сообщение 207, уровень 16, состояние 1, строка 20 Неверное имя столбца «Календарь».

Я пытаюсь использовать эту хранимую процедуру для создания отчета в SSRS. Проблема в том, что я пытаюсь передать параметр @DayType, чтобы выполнить запрос между двумя отдельными таймфреймами. Если я объявлю параметр в динамическом SQL, он будет работать, но я не знаю, как передать параметр из отчета SSRS в динамический sql @sql. Любые советы / советы? Вся помощь была отличной.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Ваш код должен быть как ниже

DECLARE @StartDate NVARCHAR(10) = '04/01/2018',
        @EndDate NVARCHAR(10) = '04/01/2018',
        @Location NVARCHAR(MAX) = 'Newcastle, Salt Creek',
        @DayType NVARCHAR(20) = 'Calendar',
        @SQL NVARCHAR(MAX)

SELECT @SQL = 'SELECT S.SiteCode,
        S.Name AS Site_Name,
        L.Name,
        DATEADD(HOUR, (T.Period) + 1, P.DateData) AS PeriodEnding,
        SUM(T.Ins) AS SumOfIns,
        SUM(T.Outs) AS SumOfOuts
FROM dbo.Location L
    INNER JOIN dbo.Traffic T ON L.ID = T.LocationID
    INNER JOIN dbo.Publish P ON T.PublishID = P.ID
    INNER JOIN dbo.Site S ON P.SiteID = S.ID
WHERE ((P.DateData) BETWEEN '''+ @StartDate +''' AND '''+ @EndDate +''')
    AND T.Ins > -1
    AND ((T.EditSequence) = 0)
    AND ((P.CanPublish) = 1)
    AND L.IsActive = 1
    AND (L.IsInternal = 0 OR L.IsInternal IS NULL)
    AND S.CustomerID = 1
    AND S.Name in (''' + REPLACE(@Location,',',''',''') + ''')
    AND ('+ @DayType +' = ''Calendar'')
    OR (S.Name in (''' + REPLACE(@Location,',',''',''') + ''') AND '+ @DayType +' = ''Business'' AND (T.Period between 7 and 17))
GROUP BY S.SiteCode,
    S.Name,
    L.Name,
    DATEADD(HOUR, (T.Period)+1, P.DateData)
ORDER BY S.SiteCode,
        S.Name,
        L.Name,
        DATEADD(HOUR, (T.Period)+1, P.DateData)';
print @sql

--EXEC sp_executesql @sql
0 голосов
/ 03 мая 2018
BETWEEN '+ @StartDate +' AND '+ @EndDate +')

должно быть

BETWEEN '''+ @StartDate +''' AND '''+ @EndDate +''')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...