Как конвертировать курсор в запросы SELECT? - PullRequest
0 голосов
/ 31 марта 2011

Я использую SSRS 2008 и у меня есть сохраненный процесс, который в настоящее время использует курсоры для удаления и добавления данных, но даже после того, как я преобразовал это для выбора запросов, я получаю сообщение об ошибке:

Сообщение 102, Уровень 15, Состояние 1, Строка 39 Неверный синтаксис рядом с ')'.

Вот исходный Курсор, который работал:

OPEN PARTS
FETCH PARTS INTO    @PART_NUM,
@PART_DESC
SET @PARTS_FETCH = @@FETCH_STATUS
WHILE @PARTS_FETCH = 0 BEGIN
SET @THE_DATE = dateadd("yy", -1, dateadd("m", -1, getdate()))
SET @END_DATE = DATEADD(ms, -5, DATEADD(mm, DATEDIFF(m, 0, getdate()) + 1, 0))

-- Get PL for part number 
Delete from @tbl_PL

Insert @tbl_PL 
SELECT FRUD.tblXref.product_code FROM FRUD.tblfieldOrderablePart INNER JOIN
FRUD.MAX_APPROVED ON FRUD.tblfieldOrderablePart.fop_no = FRUD.MAX_APPROVED.fop_no AND 
FRUD.tblfieldOrderablePart.fop_revision = FRUD.MAX_APPROVED.MaxOffop_revision INNER JOIN
FRUD.tblXref ON FRUD.MAX_APPROVED.fop_no = FRUD.tblXref.fop_no AND 
FRUD.MAX_APPROVED.MaxOffop_revision = FRUD.tblXref.fop_revision
WHERE (dbo.FORMAT_PART(FRUD.tblfieldOrderablePart.fop_no) = dbo.FORMAT_PART(@PART_NUM))
-- End Get PL

WHILE @THE_DATE <= @END_DATE BEGIN
SET @THE_DATE = DATEADD(ms, -5, DATEADD(mm, DATEDIFF(m, 0, @THE_DATE) + 1, 0))
-- Get census using PL          
SELECT @ALL_TOTAL = SUM(TheSum) FROM (SELECT CAST(RELIABILITY.Census.Census AS DECIMAL(9,2)) AS TheSum, (CONVERT(datetime, LEFT(CONVERT(char, Period), 4) + '-' + RIGHT(Period, 2) + '-1', 102)) as ThePeriod
FROM RELIABILITY.Census
WHERE RELIABILITY.Census.PL In (Select distinct * FROM @tbl_PL)
AND (CONVERT(datetime, LEFT(CONVERT(char, Period), 4) + '-' + RIGHT(Period, 2) + '-1', 102) >=
DATEADD(mm, DATEDIFF(mm, 0, @THE_DATE) - 5, 0)) AND (CONVERT(datetime, LEFT(CONVERT(char, Period), 4)
+ '-' + RIGHT(Period, 2) + '-1', 102) <= @THE_DATE)                         UNION ALL                           SELECT     CAST(Census AS DECIMAL(9,2)) AS TheSum, Period                           FROM         [MANUAL].SMARTSOLVE_CENSUS                         WHERE     (Period >= DATEADD(mm, DATEDIFF(mm, 0, @THE_DATE) - 5, 0) AND Period <= @THE_DATE) AND (PL In (Select distinct * FROM @tbl_PL)))A 

И вот мое преобразование в Select:

DECLARE @THE_DATE datetime,
        @END_DATE datetime,
        @THE_GOAL decimal(18,2),
        @PART_NUM nvarchar(50),
        @UNCHANGED_PART_NUM nvarchar(50),
        @PART_DESC varchar(35),
        @PARTS_FETCH int,
        @NUM_FAILED int,
        @AVG_CENSUS decimal(18,2),
        @PL_VAR nvarchar(50),   
        @PL_FETCH int,
        @PL_TOTAL decimal(9,2),
        @ALL_TOTAL decimal(9,2)

--WHILE @PARTS_FETCH = 0 BEGIN
    SET @THE_DATE = dateadd("yy", -1, dateadd("m", -1, getdate()))
    SET @END_DATE = DATEADD(ms, -5, DATEADD(mm, DATEDIFF(m, 0, getdate()) + 1, 0))  
    --WHILE @THE_DATE <= @END_DATE BEGIN
SET @THE_DATE = DATEADD(ms, -5, DATEADD(mm, DATEDIFF(m, 0, @THE_DATE) + 1, 0))
-- Get census using PL

SELECT @ALL_TOTAL = SUM(TheSum) FROM 
(SELECT CAST(RELIABILITY.Census.Census AS DECIMAL(9,2)) AS TheSum 
from RELIABILITY.Census
WHERE RELIABILITY.Census.PL In (Select distinct * FROM #tbl_PL) 
AND (CONVERT(datetime, LEFT(CONVERT(char, Period), 4) + '-' + RIGHT(Period, 2) + '-1', 102) >=  
DATEADD(mm, DATEDIFF(mm, 0, @THE_DATE) - 5, 0)) AND (CONVERT(datetime, LEFT(CONVERT(char, Period), 4)+ '-' + RIGHT(Period, 2) + '-1', 102) <= @THE_DATE)                    
UNION ALL
SELECT     CAST(Census AS DECIMAL(9,2)) AS TheSum, Period           
FROM         [MANUAL].SMARTSOLVE_CENSUS                 
WHERE     (Period >= DATEADD(mm, DATEDIFF(mm, 0, @THE_DATE) - 5, 0) AND Period <= @THE_DATE) AND (PL In (Select distinct * FROM #tbl_PL))
))A

Ответы [ 3 ]

2 голосов
/ 31 марта 2011

Как указали Джоэл и Ламак, у вас есть лишнее) Это действительно очень легко найти, если вы используете что-то вроде Instant SQL formatter Это выдаст ошибку

)(11,3) expected token:Unknown
)(11,3) expected token: 

Этотакже форматирует SQL, как показано ниже, что немного облегчает его отслеживание.

SELECT @ALL_TOTAL = SUM(thesum) 
FROM   (SELECT CAST(reliability.census.census AS DECIMAL(9, 2)) AS thesum 
        FROM   reliability.census 
        WHERE  reliability.census.pl IN (SELECT DISTINCT * 
                                         FROM   #tbl_pl) 
               AND ( CONVERT(DATETIME, LEFT(CONVERT(CHAR, period), 4) + '-' + 
                     RIGHT( 
                     period, 2) 
                     + 
                     '-1' 
                     , 102) >= Dateadd(mm, Datediff(mm, 0, @THE_DATE) - 5, 0) ) 
               AND ( CONVERT(DATETIME, LEFT(CONVERT(CHAR, period), 4)+ '-' + 
                     RIGHT( 
                     period, 2) + 
                     '-1', 
                     102) <= @THE_DATE ) 
        UNION ALL 
        SELECT CAST(census AS DECIMAL(9, 2)) AS thesum, 
               period 
        FROM   [MANUAL].smartsolve_census 
        WHERE  ( period >= Dateadd(mm, Datediff(mm, 0, @THE_DATE) - 5, 0) 
                 AND period <= @THE_DATE ) 
               AND ( pl IN (SELECT DISTINCT * 
                            FROM   #tbl_pl) ))a 
1 голос
/ 31 марта 2011

Если я правильно читаю ваш запрос, у вас есть две ошибки. Первый - это дополнительный символ ")" в последней строке, он должен быть:

WHERE     (Period >= DATEADD(mm, DATEDIFF(mm, 0, @THE_DATE) - 5, 0) AND Period <= @THE_DATE) AND (PL In (Select distinct * FROM #tbl_PL))
) A

И, я думаю, у вас также есть больше столбцов в вашем запросе после UNION ALL, вы выбираете CAST(Census AS DECIMAL(9,2)) AS TheSum, Period, а в первом вы выбираете только один столбец: CAST(RELIABILITY.Census.Census AS DECIMAL(9,2)) AS TheSum

1 голос
/ 31 марта 2011

Похоже, у вас не совпадают круглые скобки, дважды проверьте и убедитесь, что они все выстроены правильно. У вас есть еще один знак ")" в конце этого последнего оператора выбора, который вы когда-либо открывали. Это много вложений! Убедитесь, что все соответствует вашим ожиданиям, или вы можете получить неожиданные результаты, если ваш UNION будет применен на неправильном уровне или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...