Burak Gürsoy
Burak Gürsoy

Reputation: 11

Converting SQL Server code to Firebird produces "Token unknown" error

I have my SQL Server code available, but I couldn't convert it to Firebird no matter how hard I tried. I would like your help in this matter. SQL Server and Firebird all tables are the same and the data types are the same.

SQL Server Database

SQL Server "STOK_FIYAT" Table Design

SQL Server "STOK_FIYAT" Table Design

SQL Server "STOK_FIYAT" Table Data

SQL Server "STOK_FIYAT" Table Data

SQL Server "STOK" Table Design

SQL Server "STOK" Table Design

SQL Server "STOK" Table Data

SQL Server "STOK" Table Data

My query string:

DECLARE @cols AS NVARCHAR(MAX),
  @query  AS NVARCHAR(MAX),
  @ColumnNameCollection AS NVARCHAR(MAX),
  @HeaderNameCollection AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT ',' + QUOTENAME(SF.FIYAT_NO)
            FROM STOK_FIYAT SF
      GROUP BY SF.FIYAT_NO
      ORDER BY SF.FIYAT_NO ASC
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')

-- Get header list. A DISTINCT list of CompMesoIDs
SELECT @HeaderNameCollection= ISNULL(@HeaderNameCollection + ',','') 
       + QUOTENAME(FIYAT_NO) + ' as FIYAT_' + CAST(FIYAT_NO AS VARCHAR(16))
FROM (SELECT FIYAT_NO FROM STOK_FIYAT) AS STFIYAT 
GROUP BY STFIYAT.FIYAT_NO
ORDER BY STFIYAT.FIYAT_NO

set @query = 'SELECT BLKODU,STOKKODU,STOK_ADI,'+@HeaderNameCollection+'  FROM (SELECT STOK.[BLKODU], [STOKKODU], [STOK_ADI], [FIYAT_NO], [FIYATI] FROM STOK LEFT JOIN STOK_FIYAT ON STOK.BLKODU = STOK_FIYAT.BLSTKODU) AS SourceTable PIVOT(MAX([FIYATI]) FOR [FIYAT_NO] IN('+@cols+')) AS PivotTable ORDER BY BLKODU ASC;'
execute(@query)

SQL output:

SQL Server output

I have to do all the operations for Firebird.

Firebird Database:

Firebird "STOK" Table Design

Firebird "STOK" Table Design

Firebird "STOK_FIYAT" Table Design

Firebird "STOK_FIYAT" Table Design

I am not experienced with Firebird. The code I tried myself:

SET TERM ^ ;

EXECUTE BLOCK
AS
DECLARE cols VARCHAR(255);
DECLARE query VARCHAR(255);
DECLARE ColumnNameCollection VARCHAR(255);
DECLARE HeaderNameCollection VARCHAR(255);

BEGIN

cols = STUFF((SELECT ',' + QUOTENAME(SF.FIYAT_NO)
            FROM STOK_FIYAT SF
      GROUP BY SF.FIYAT_NO
      ORDER BY SF.FIYAT_NO ASC
            FOR XML PATH(''), TYPE
            ).value('.', 'VARCHAR(255)')
        ,1,1,'')

SELECT :HeaderNameCollection= ISNULL(:HeaderNameCollection + ',','') 
       + QUOTENAME(FIYAT_NO) + ' as FIYAT_' + CAST(FIYAT_NO AS VARCHAR(16))
FROM (SELECT FIYAT_NO FROM STOK_FIYAT) AS STFIYAT 
GROUP BY STFIYAT.FIYAT_NO
ORDER BY STFIYAT.FIYAT_NO

set @query = 'SELECT BLKODU,STOKKODU,STOK_ADI,'+:HeaderNameCollection+'  FROM (SELECT STOK.[BLKODU], [STOKKODU], [STOK_ADI], [FIYAT_NO], [FIYATI] FROM STOK LEFT JOIN STOK_FIYAT ON STOK.BLKODU = STOK_FIYAT.BLSTKODU) AS SourceTable PIVOT(MAX([FIYATI]) FOR [FIYAT_NO] IN('+:cols+')) AS PivotTable ORDER BY BLKODU ASC;'
execute(@query)

END
^

set term ; ^

The error I get:

Engine Error (code = 335544569):
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 14, column 13.
FOR.

SQL Error (code = -104):
Invalid token.

Upvotes: 1

Views: 301

Answers (0)

Related Questions