Неверный синтаксис SQL 'Союз' - PullRequest
0 голосов
/ 02 мая 2018

Я не понимаю, зачем выдает мне эту ошибку. Не пишите union, как эта ошибка. Пожалуйста, дайте мне решение. Если вы хотите получить этот код, можете написать его.

DECLARE @StartDate DATETIME;

/* WHERE */

SET @StartDate = 

/* T0.TaxDate */

'';

/*SELECT FROM [dbo].[OINV] T1*/

DECLARE @EndDate DATETIME;

/* WHERE */

SET @EndDate = 

/* T1.TaxDate */

'';

/*SELECT FROM [dbo].[OINV] T2*/

DECLARE @OurOffice VARCHAR(MAX);

/* WHERE */

SET @OurOffice = 

/* T2.U_CFFIRMASI */ 

'';

IF(@StartDate = '')
    SET @StartDate =
(
    SELECT TOP 1 T0.TaxDate
    FROM OINV T0
    ORDER BY T0.TaxDate ASC
);
IF(@EndDate = '')
    SET @EndDate =
(
    SELECT TOP 1 T0.TaxDate
    FROM OINV T0
    ORDER BY T0.TaxDate DESC
);
DECLARE @MyTemp TABLE
(DatabaseName VARCHAR(MAX),
 RowNumber    INT
);
INSERT INTO @MyTemp
(RowNumber,
 DatabaseName
)
       SELECT RowNumber,
              DatabaseName
       FROM QUESINTERNATIONALCORP.dbo.GETVOLUMEQTYDATABASES();
DECLARE @loopLimit INT=
(
    SELECT TOP 1 RowNumber
    FROM @MyTemp
    ORDER BY RowNumber DESC
);
DECLARE @loopCounter INT= 1;
DECLARE @sqlInsertCommand NVARCHAR(MAX);
DECLARE @sqlSingleCommand NVARCHAR(MAX);
DECLARE @myTempTableName NVARCHAR(80);
DECLARE @SystemCurr NVARCHAR(3);
DECLARE @MainCurr NVARCHAR(3);
DECLARE @myTempleTableRealName NVARCHAR(MAX);
DECLARE @SystemCurrSql NVARCHAR(MAX);
DECLARE @MainCurrSql NVARCHAR(MAX);
DECLARE @myTempleTableRealNameSQL NVARCHAR(MAX);
WHILE(@loopCounter <= @loopLimit)
    BEGIN
        SET @myTempTableName =
(
    SELECT DatabaseName
    FROM @MyTemp
    WHERE RowNumber = @loopCounter
);
        SET @SystemCurrSql = N'SELECT @SystemCurrOut = 
    SysCurrncy
    FROM '+@myTempTableName+'.dbo.OADM';
        SET @MainCurrSql = N'SELECT @MainCurrOut = 
    MainCurncy
    FROM '+@myTempTableName+'.dbo.OADM';
        SET @myTempleTableRealNameSQL = N'SELECT @MainNameOut = 
    CompnyName
    FROM '+@myTempTableName+'.dbo.OADM';
        EXECUTE sp_executesql
                @SystemCurrSql,
                N'@SystemCurrOut NVARCHAR(3) OUTPUT',
                @SystemCurrOut = @SystemCurr OUTPUT;
        EXECUTE sp_executesql
                @MainCurrSql,
                N'@MainCurrOut NVARCHAR(3) OUTPUT',
                @MainCurrOut = @MainCurr OUTPUT;
        EXECUTE sp_executesql
                @myTempleTableRealNameSQL,
                N'@MainNameOut NVARCHAR(MAX) OUTPUT',
                @MainNameOut = @myTempleTableRealName OUTPUT;
        SET @sqlSingleCommand = '

(SELECT RESULT.Country,
       RESULT.[Our Office],
       RESULT.[Inv.Company],
       RESULT.[Team Leader],
       RESULT.[Trade/Comm.],
       RESULT.[Inv. Date],
       RESULT.Customer,
       RESULT.Department,
       RESULT.[Cust.Inv.No],
      RESULT.SoNum,
      RESULT.PONum,
       RESULT.[Mfr. Name],
       RESULT.[Mfr.Inv.No],
       RESULT.Terms,
       RESULT.[Due Date],
       RESULT.[Sales(Original)],
       RESULT.[Currency(S)],
       RESULT.[Cost of Sales(Original)],
       RESULT.[Currency(COS)],
       RESULT.[Sales(Original)] - RESULT.[Cost of Sales(Original)] AS [Gross Profit],
       CAST(CAST(((RESULT.[Sales(Original)] - RESULT.[Cost of Sales(Original)]) / (CASE
                                                                                       WHEN RESULT.[Sales(Original)] = 0
                                                                                       THEN 1
                                                                                       ELSE RESULT.[Sales(Original)]
                                                                                   END)) * 100 AS DECIMAL(19, 2)) AS NVARCHAR)+[%] AS [Margin %],
       RESULT.SOQuantity,
       RESULT.POQuantity,
       RESULT.ARQuantity,
       RESULT.APQuantity,
       RESULT.[Sales(Reporting)],
       RESULT.[Cost of Sales(Reporting)],
       RESULT.[Sales(Reporting)] - RESULT.[Cost of Sales(Reporting)] AS [Gross Profit],
       CAST(CAST(((RESULT.[Sales(Reporting)] - RESULT.[Cost of Sales(Reporting)]) / (CASE
                                                                                    WHEN RESULT.[Sales(Reporting)] = 0
                                                                                    THEN 1
                                                                                    ELSE RESULT.[Sales(Reporting)]
                                                                                END)) * 100 AS DECIMAL(19, 2)) AS NVARCHAR)+[%] AS [Margin %],
       RESULT.DocRate,
       RESULT.Month,
       RESULT.Year,
       RESULT.Week
FROM
(
    SELECT T0.U_URETIMULKESI AS [Country],
           T0.U_CFFIRMASI AS [Our Office],
(
    SELECT A0.CompnyName
    FROM '+@myTempTableName+'.dbo.OADM A0
) AS [Inv.Company],
           T8.Name AS [Team Leader],
           T0.U_ARGNS_OrderType AS [Trade/Comm.],
           T5.TaxDate AS [Inv. Date],
           T0.CardName AS [Customer],
           T9.U_ARGNS_LineCode AS [Department],
           T5.U_FATNO AS [Cust.Inv.No],
           T3.CardName AS [Mfr. Name],
           T11.U_FATNO AS [Mfr.Inv.No],
           T12.PymntGroup AS [Terms],
           T5.DocRate,
           T5.DocDueDate AS [Due Date],
           ((CASE
                 WHEN T4.Currency =
(
    SELECT A0.MainCurncy
    FROM '+@myTempTableName+'.dbo.OADM A0
)
                 THEN T4.LineTotal
                 WHEN T4.Currency =
(
    SELECT A0.SysCurrncy
    FROM '+@myTempTableName+'.dbo.OADM A0
)
                 THEN T4.TotalSumSy
                 ELSE T4.TotalFrgn
             END) * (1 - T0.DiscPrcnt)) AS [Sales(Original)],
           T4.Currency AS [Currency(S)],
           (CASE
                WHEN T6.Currency =
(
    SELECT A0.MainCurncy
    FROM '+@myTempTableName+'.dbo.OADM A0
)
                THEN T6.OpenSum
                WHEN T6.Currency =
(
    SELECT A0.SysCurrncy
    FROM '+@myTempTableName+'.dbo.OADM A0
)
                THEN T6.OpenSumSys
                ELSE T6.OpenSumFC
            END) AS [Cost of Sales(Original)],
           T6.Currency AS [Currency(COS)],
           T1.Quantity AS [SOQuantity],
           T2.Quantity AS [POQuantity],
           T4.Quantity AS [ARQuantity],
           T6.Quantity AS [APQuantity],
           T6.OpenSumSys AS [Cost of Sales(Reporting)],
           T4.OpenSumSys AS [Sales(Reporting)],
           MONTH(T5.TaxDate) AS [Month],
           YEAR(T5.TaxDate) AS [Year],
           DATEPART(wk, T5.TaxDate) AS [Week],
         T0.DocEntry as [SoNum],
         T3.DocEntry as [PoNum]
    FROM '+@myTempTableName+'.dbo.ORDR T0
         INNER JOIN '+@myTempTableName+'.dbo.RDR1 T1 ON T1.DocEntry = T0.DocEntry
         INNER JOIN '+@myTempTableName+'.dbo.POR1 T2 ON T2.BaseEntry = T1.DocEntry
                               AND T2.BaseLine = T1.LineNum
                               AND T2.BaseType = T1.ObjType
         INNER JOIN '+@myTempTableName+'.dbo.OPOR T3 ON T3.DocEntry = T2.DocEntry
         INNER JOIN '+@myTempTableName+'.dbo.INV1 T4 ON T4.BaseEntry = T1.DocEntry
                               AND T4.BaseLine = T1.LineNum
                               AND T4.BaseType = T1.ObjType
         INNER JOIN '+@myTempTableName+'.dbo.OINV T5 ON T5.DocEntry = T4.DocEntry
         LEFT JOIN '+@myTempTableName+'.dbo.PCH1 T6 ON T6.BaseEntry = T2.DocEntry
                               AND T6.BaseLine = T2.LineNum
                               AND T6.BaseType = T2.ObjType
         LEFT JOIN '+@myTempTableName+'.dbo.OPCH T11 ON T11.DocEntry = T6.DocEntry
         LEFT JOIN '+@myTempTableName+'.dbo.OHEM T7 ON T7.empID = T0.OwnerCode
         LEFT JOIN '+@myTempTableName+'.dbo.OUDP T8 ON T8.Code = T7.dept
         LEFT JOIN '+@myTempTableName+'.dbo.'+@myTempTableName+'.dbo.OITM T9 ON T9.ItemCode = T1.ItemCode
         LEFT JOIN '+@myTempTableName+'.dbo.OUBR T10 ON T10.Code = T7.branch
         LEFT JOIN '+@myTempTableName+'.dbo.OCTG T12 ON T5.GroupNum = T12.GroupNum
    WHERE T0.Canceled = ''N''
          AND T3.CANCELED = ''N''
          AND T5.CANCELED = ''N''
      AND T5.TaxDate BETWEEN @StartDate AND @EndDate
      AND (T5.U_CFFIRMASI = @OurOffice
           OR @OurOffice = '''')
) AS RESULT ) ';
 IF(@loopCounter = 1)
            BEGIN
                SET @sqlInsertCommand = @sqlSingleCommand;
            END;
            ELSE
            BEGIN
                SET @sqlInsertCommand = @sqlInsertCommand+'UNION ALL '+@sqlSingleCommand;
                select @sqlInsertCommand
            END;
        SET @loopCounter = @loopCounter + 1;
    END;

EXECUTE sp_executesql
        @sqlInsertCommand;

Сообщение 156, Уровень 15, Состояние 1, Строка 103 Неверный синтаксис рядом с ключевым словом «СОЮЗ». Сообщение 102, Уровень 15, Состояние 1, Строка 408 Неверный синтаксис рядом 'Год'.

Ответы [ 2 ]

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

Я думаю, у вас есть целый мир проблем:

  1. у вас, похоже, есть заполнители для @StartDate, @EndDate и @OurOffice, но я не вижу, чтобы вы объявили их как параметры при передаче в sp_executesql? (Потенциально причина вашей первой ошибки).
  2. вы объединяете nvarchar (80) (@myTempTableName) в nvarchar (макс.). Это приведет к неявному преобразованию @sqlSingleCommand в строку длиной 8000 байтов (я полагаю, 4000 символов для nvarchar). См. здесь для примера такого поведения. (может быть причиной вашей второй ошибки).
  3. Точка 2 также может быть применима при попытке создать @ sqlInsertCommand.
  4. @ OurOffice - это varchar (max), который, я думаю, снова вызовет неявное преобразование при генерации команды sql, поскольку вы добавляете это в переменную nvarchar (max). Подобный вопрос и пример здесь

Решения:

  1. Убедитесь, что все ваши переменные объявлены надлежащим образом. (т.е. nvarchar).
  2. Вам необходимо передать @StartDate, @EndDate и @OurOffice в ваш вызов sp_executesql.

Дополнительно:

Если вы не анализируете пользовательский ввод в свой код, вы можете избежать использования EXEC (@sqlcommmand) вместо EXEC sp_executesql, поскольку EXEC не имеет ограничений на размер запроса, так как он не параметризован (обсуждено здесь )

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

Я думаю, что переменная @sqlInsertCommand слишком мала.

Попробуйте разделить ваш запрос на несколько переменных и изменить

EXECUTE sp_executesql
        @sqlInsertCommand;

до

EXEC('EXEC sp_executesql N''' + @sql1 + @sql2 + @sql3 + @sql4 + '''')

P.S. Не стоит писать такие длинные динамические запросы. Однако я понимаю, что где-то кому-то может потребоваться такой запрос.

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