0

Been trying for some hours to convert this to a query I can use with OPENQUERY in SQL Server 2014 (to use with Progress OpenEdge 10.2B via ODBC). Can't seem to get the escaping of the quote right. Can anyone offer some assistance? Is there a tool to do it?

(There's a SQL table called @tAPBatches that is used in this, but I omitted it from this code)

    DECLARE
    @NoDays AS INT = 30
   ,@Prefix AS VARCHAR(5) = 'M_AP_'

SELECT
                    @Prefix + LTRIM(CAST(gh.[Batch-Number] AS VARCHAR(20))) AS BatchNo
                    ,gh.[Batch-Number] AS BatchNo8
                   , aph.[Reference-number]  AS InvoiceNo
                   ,aph.[Voucher-Number] AS VoucherNo
                   ,aph.[Amount] AS InvoiceTotal
                  ,gh.[Journal-Number] AS JournalNo
                   ,4 AS FacilityID
                   ,CASE aph.[voucher-type]
                        WHEN 'DM' THEN 5 
                        ELSE 1 
                        END AS DocType 
                   ,apb.[Batch-Desc] AS BatchDesc
                    ,apb.[Posting-Date] AS PostingDate
                   ,apb.[Posting-Period]
                   ,apb.[Posting-Fiscal-Year]
                   ,apb.[Batch-Status]
                   ,apb.[Expected-Count]
                   ,apb.[Expected-Amount]
                   ,apb.[Posted-To-GL-By]
                   ,'Broadview' AS FacilityName
                   ,apb.[Date-Closed] AS BatchDate 
                   ,gh.[Posted-by] AS PostUser
                   ,gh.[Posted-Date] AS PostDT
                   ,gh.[Created-Date] AS CreateDT
                   ,gh.[Created-By] AS CreateUser
                   ,aph.[Supplier-Key] AS VendorID 
                   ,sn.[Supplier-Name]
                   ,aph.[Invoice-Date] AS InvoiceDate
                   ,-1 AS Total
                   ,-1 AS Discount
                   ,gh.[Posted-by] AS Username
                    ,CASE gt.[Credit-Debit]
                   WHEN 'CR' THEN LEFT(CAST(gacr.[GL-Acct] AS VARCHAR(20)), 2) + '.' + SUBSTRING(CAST(gacr.[GL-Acct] AS VARCHAR(20)), 3, 6) + '.'
                    + RIGHT(CAST(gacr.[GL-Acct] AS VARCHAR(20)), 3)
                    ELSE NULL
                    END AS GLCreditAcct
                    ,CASE gt.[Credit-Debit]
                   WHEN 'DR' THEN LEFT(CAST(gacr.[GL-Acct] AS VARCHAR(20)), 2) + '.' + SUBSTRING(CAST(gacr.[GL-Acct] AS VARCHAR(20)), 3, 6) + '.'
                    + RIGHT(CAST(gacr.[GL-Acct] AS VARCHAR(20)), 3)
                    ELSE NULL
                    END AS GLDebitAcct
                    ,CASE gt.[Credit-Debit]
                   WHEN 'CR' THEN gacr.[Report-Label] 
                    ELSE NULL
                    END AS GLCreditDesc
                      ,CASE gt.[Credit-Debit]
                   WHEN 'DR' THEN gacr.[Report-Label] 
                    ELSE NULL
                    END AS GLDebitDesc
                   ,'D' AS [Status]
                   ,aph.[PO-Number] AS PoNo
                   ,aph.[Terms-Code] AS TermsCode
                   ,aph.[Due-Date] AS DueDate
                   ,'' AS Comments
                   ,aph.[Discount-Date] AS DiscountDate
                   ,aph.[Discount-Amount] AS DiscountAmount
                   ,aph.[Discount-Taken] AS DiscountTaken
                   ,aph.[Amount] AS APAmount
                   ,gt.[Amount]
                   ,'BA REGULAR     ' AS CheckBookID  --ToDO
                   ,0 AS Transferred
                   ,aph.[voucher-type] AS VoucherType
                   ,gt.[Credit-Debit]
                   ,gacr.[Account-type]
                   ,aph.[Freight-Ref-Num]
                 FROM
                    [Progress].[GAMS1].pub.[GL-Entry-Header] gh
                    INNER JOIN [Progress].[GAMS1].pub.[gl-entry-trailer] gt ON gt.[System-ID] = gh.[System-ID] AND gt.[Origin] = gh.[Origin] AND gt.[Journal-Number] = gh.[Journal-Number] 
                INNER JOIN [Progress].[GAMS1].pub.[apinvhdr] aph ON (gh.[Journal-Number] = aph.[Journal-Number]  
                OR (gh.[Journal-Num-Reversal-Of] = aph.[Journal-Number] AND aph.[Journal-Number] <> '        ' AND gh.[Journal-Num-Reversal-Of] <> '        '))
                                                                    AND gh.[system-id] = aph.[system-id-gl]
                                                                    AND gh.origin = 'inv'  
                                                                    AND gh.[system-id] = 'arcade' 
                INNER JOIN [Progress].[GAMS1].pub.[APInvoiceBatch] apb ON gh.[Batch-number] = apb.[Batch-number]
                                                                          AND apb.[system-id] = 'lehigh'
                                                                          AND apb.[Posted-To-GL] = 1 
                INNER JOIN [Progress].[GAMS1].pub.[GL-accts] gacr ON gacr.[system-id] = gt.[system-id]
                                                                     AND gacr.[Gl-Acct-Ptr] = gt.[GL-Acct-Ptr] 

                INNER JOIN  [Progress].[GAMS1].pub.[suppname] sn  ON  sn.[Supplier-Key] = aph.[Supplier-Key]
                                                                        AND sn.[system-id] = 'arcade'

                WHERE
                    gh.[Posted-Date] > CAST(DATEADD(DAY, -@NoDays, GETDATE()) AS DATE)
                    AND case 
                        when CAST(gh."Posting-Period" as int) < 10 then gh."Posting-Year" + '0' + ltrim(gh."Posting-Period")
                        else gh."Posting-Year" + Ltrim(gh."Posting-Period")
                        end > '201501'
                    AND gh.[Batch-number] NOT IN (SELECT
                                                            BatchNo COLLATE SQL_Latin1_General_CP1_CI_AS
                                                         FROM
                                                            @tAPBatches) 

TIA

MArk

Here's an example of what's giving me a syntax error. This works, but "M_AP_" is a parameter passed to SP

 DECLARE
    @NoDays AS INT = 5
   ,@Prefix AS VARCHAR(5) = 'M_AP_';

  DECLARE
    @InterestDate AS varchar(20)

   SELECT @InterestDate = CAST(CAST(DATEADD(DAY, -@NoDays, GETDATE()) AS DATE) AS VARCHAR(20))

   SELECT * FROM OPENQUERY(PROGRESS, 
   'SELECT TOP 100 ''M_AP_'' + LTRIM(CAST(gh."Batch-Number" AS VARCHAR(20))) AS BatchNo
               , gh."Batch-Number" 

This works, but when I try to swap in the variable I get Incorrect Syntax near '+'

 DECLARE
    @NoDays AS INT = 5
   ,@Prefix AS VARCHAR(5) = 'M_AP_';

  DECLARE
    @InterestDate AS varchar(20)

   SELECT @InterestDate = CAST(CAST(DATEADD(DAY, -@NoDays, GETDATE()) AS DATE) AS VARCHAR(20))

   SELECT * FROM OPENQUERY(PROGRESS, 
   'SELECT TOP 100 '' ' + @Prefix + ' '' + LTRIM(CAST(gh."Batch-Number" AS VARCHAR(20))) AS BatchNo
               , gh."Batch-Number" 

            FROM
               "GAMS1".pub."GL-Entry-Header" gh
mark1234
  • 1,110
  • 2
  • 24
  • 41
  • What kind of error message are you getting? Do you have any idea where in the above code the problem with quotes is occurring? You may have to break the query down into subqueries and debug each on individually. – user8128167 Dec 15 '15 at 23:37
  • I'm getting syntax errors, which are clearly due to incorrect quotes. i looked on MS online docs and one of there examples ended with something like 7 quotes + ")" + 5 quotes. I don;t comprehend how you end up with 7 quotes in a row! – mark1234 Dec 16 '15 at 11:38

1 Answers1

0

OPENQUERY will only support a string literal query that is less than 8K. You might be running into that limit if you've got even more code that you're not showing here. Make sure that your query is less than 8000 bytes, or create procedures or views to reduce the size of your query.

It only accepts a single string literal... so if you are trying to concatenate strings and parameters together, it will not work. There are some ways to work around this by using dynamic SQL or creating supporting tables or views for filters.

Community
  • 1
  • 1
Brian Pressler
  • 6,653
  • 2
  • 19
  • 40