2

Visual Studio 2008 のクエリ ペインでエラーが発生しますが、それがわかりません。

関数の引数のリストにエラーがあります: '=' が認識されません。クエリ テキストを解析できません。

構文をクリーンアップし、適切な引用符をいくつか追加した後も、問題は解決しませんでした。とにかくクエリを実行しようとしたところ、Visual Studio 2008 で際限​​なく待機してしまいました。

これがクエリです。

 SELECT 
 leg.tsrido, 
 leg.tsrnum, 
 shipment.dosvlg, 
 condition(leg.tsakti = 1, load.land, unload.land), 
 condition(leg.tsakti = 1, load.postun, unload.postun), 
 condition(leg.tsakti = 1, load.tsadr1, unload.tsadr1) 

 FROM 
 tsroma leg 
 LEFT OUTER JOIN (SELECT * FROM tsdsmd WHERE (srtdos = 'd')) shipment 
 ON leg.dosvlg = shipment.dosvlg 

 LEFT OUTER JOIN (SELECT * FROM tsdnaw WHERE (tsroln = 1)) load 
 ON leg.dosvlg = load.dosvlg 

 LEFT OUTER JOIN (SELECT * FROM tsdnaw WHERE (tsroln = 3)) unload 
 ON leg.dosvlg = unload.dosvlg 

 WHERE (leg.tsrido = 79106279)

 ORDER BY 2

ODBC を使用しており、接続文字列に Driver={UNIMS} が含まれています。私のアプリケーションでサポートする必要があるのは非常に古いデータベースです。

おそらくどこかで構文に問題があるのでしょうが、私にはわかりません。

Edit1: UNIMS データベースで「WORKS」する条件コードの例を次に示します。(古いアプリケーションの AnsiString から取り出したものです。)

condition(leg.tstohn = '" + pAuthorization[7] + "', shipment.pllaad, shipment.pllos)
condition(leg.tstohn = '" + pAuthorization[7] + "', shipment.tslzcd, shipment.tsuzcd)
condition(leg.tstohn = '" + pAuthorization[7] + "', shipment.lalaad, shipment.lalos)         
condition(leg.tstohn = '" + pAuthorization[7] + "', shipment.nmlaad, shipment.nmlos) zkafz
condition(leg.tstohn = '" + pAuthorization[7] + "', shipment.adrlaa, shipment.adrlos)

編集2:

また、UNIMS SQL UNIMS SQL に関する多くのドキュメントを見つけることができません。さらに役立つ情報を次に示します。

  • ドライバー={UNIMS};
  • ODBC 用の .NET Framework データ プロバイダー
  • UNIMS SQL
  • ステートオープン
  • バージョン 02.05.0028

Edit3: これがC#コード全体です

public string qShipments(string a)
{
    string q = "";
    #region Oracle
    if (env == "Oracle")
    {
        /* string Oracle_Shipment
         * Alias issue: http://stackoverflow.com/questions/14218695/ora-00972-identifier-is-too-long
                        SELECT DISTINCT
                        csl."tripNumber",
                        csl."shipmentNumber",
                        csl."legType",
                        csl."planSequence",
                        csl."toHubSearchname",
                        CASE WHEN csl."legType" = 1 THEN Address1."countryCode" ELSE Address3."countryCode" END countryCode,
                        CASE WHEN csl."legType" = 1 THEN Address1."postcode" ELSE Address3."postcode" END postcode,
                        CASE WHEN csl."legType" = 1 THEN Address1."streetLine1" ELSE  Address3."streetLine1" END streetLine

                        FROM 
                        "cef_v_cw_trip" ct 
                        LEFT OUTER JOIN "cef_v_cw_shipmentLegs" csl 
                        ON ct."tripNumber" = csl."tripNumber"

                        LEFT OUTER JOIN "cef_v_cw_shipment" cs 
                        ON csl."shipmentNumber" = cs."shipmentNumber"

                        LEFT OUTER JOIN (SELECT * FROM "cef_v_cw_fileAddress" WHERE "addressRole" = 1) Address1
                        ON cs."shipmentNumber" = Address1."fileNumber"

                        LEFT OUTER JOIN (SELECT * FROM "cef_v_cw_fileAddress" WHERE "addressRole" = 3) Address3
                        ON cs."shipmentNumber" = Address3."fileNumber"

                        WHERE ct."tripNumber" = '1045013'
                        AND csl."toHubSearchname" <> ' '
                        ORDER BY 4
         */
        q = string.Format("SELECT DISTINCT " +
                             "csl.\"tripNumber\", " +
                             "csl.\"shipmentNumber\", " +
                             "csl.\"legType\", " +
                             "csl.\"planSequence\", " +
                             "csl.\"toHubSearchname\", " +
                             "CASE WHEN csl.\"legType\" = 1 THEN Address1.\"countryCode\" ELSE Address3.\"countryCode\" END countryCode, " +
                             "CASE WHEN csl.\"legType\" = 1 THEN Address1.\"postcode\" ELSE Address3.\"postcode\" END postcode, " +
                             "CASE WHEN csl.\"legType\" = 1 THEN Address1.\"streetLine1\" ELSE  Address3.\"streetLine1\" END streetLine " +
                             "FROM " +
                             "\"{0}v_cw_trip\" ct " +
                             "LEFT OUTER JOIN \"{0}v_cw_shipmentLegs\" csl " +
                             "ON ct.\"tripNumber\" = csl.\"tripNumber\" " +
                             "LEFT OUTER JOIN \"{0}v_cw_shipment\" cs " +
                             "ON csl.\"shipmentNumber\" = cs.\"shipmentNumber\" " +
                             "LEFT OUTER JOIN (SELECT * FROM \"{0}v_cw_fileAddress\" WHERE \"addressRole\" = 1) Address1 " +
                             "ON cs.\"shipmentNumber\" = Address1.\"fileNumber\" " +
                             "LEFT OUTER JOIN (SELECT * FROM \"{0}v_cw_fileAddress\" WHERE \"addressRole\" = 3) Address3 " +
                             "ON cs.\"shipmentNumber\" = Address3.\"fileNumber\" " +
                             "WHERE ct.\"tripNumber\" = {1} " +
                             "AND csl.\"toHubSearchname\" <> ' ' " +
                             "ORDER BY 4", prefix, a.ToString());
    }
    #endregion

    #region UNIMS
    if (env == "UNIMS")
    {
        /* string Unims shipment  
         * http://stackoverflow.com/questions/14379573/error-in-list-of-function-arguments-not-recognized-unable-to-parse-query-t
             SELECT 
             leg.tsrido, 
             leg.tsrnum, 
             shipment.dosvlg, 
             condition(leg.tsakti = 1, load.land, unload.land), 
             condition(leg.tsakti = 1, load.postun, unload.postun), 
             condition(leg.tsakti = 1, load.tsadr1, unload.tsadr1) 

             FROM 
             tsroma leg 
             LEFT OUTER JOIN (SELECT * FROM tsdsmd WHERE (srtdos = 'd')) shipment 
             ON leg.dosvlg = shipment.dosvlg 

             LEFT OUTER JOIN (SELECT * FROM tsdnaw WHERE (tsroln = 1)) load 
             ON leg.dosvlg = load.dosvlg 

             LEFT OUTER JOIN (SELECT * FROM tsdnaw WHERE (tsroln = 3)) unload 
             ON leg.dosvlg = unload.dosvlg 

             WHERE (leg.tsrido = 79106279)

             ORDER BY 2
         */
        q = string.Format("SELECT " +
                        "leg.tsrido, " +
                        "leg.tsrnum, " +
                        "shipment.dosvlg, " +
                        "condition(leg.tsakti = 1, load.land, unload.land), " +
                        "condition(leg.tsakti = 1, load.postun, unload.postun), " +
                        "condition(leg.tsakti = 1, load.tsadr1, unload.tsadr1) " +
                        "FROM " +
                        "tsroma leg " +
                        "LEFT OUTER JOIN (SELECT * FROM tsdsmd WHERE srtdos = 'd') shipment " +
                        "ON leg.dosvlg = shipment.dosvlg " +
                        "LEFT OUTER JOIN (SELECT * FROM tsdnaw where tsroln = 1) load " +
                        "ON leg.dosvlg = load.dosvlg " +
                        "LEFT OUTER JOIN (SELECT * FROM tsdnaw where tsroln = 3) unload " +
                        "ON leg.dosvlg = unload.dosvlg " +
                        "WHERE leg.tsrido = {1} " +
                        "ORDER BY 2", prefix, a.ToString());
    }
    #endregion
    return q;
}

Edit4: 以下のケースを削除すると、クエリが無限にあることに気付きました。まず、ODBC 接続を再検討しようと思います。

Edit5: ほとんどの場合、PuTTY またはマシンに直接接続しても機能しないようです。何らかの理由で、リソースを大量に消費するクエリになってしまいます。新しいアプローチ: PuTTY の適切なクエリで問題が解決されましたが、これは ODBC Unim ではまだ受け入れられていません。

                select 
                    leg.tsrido, 
                    leg.tsrnum, 
                    dosier.dosvlg, 
                    condition(leg.tsakti = 1, dosier.lalaad, dosier.lalos), 
                    condition(leg.tsakti = 1, dosier.pklaad, dosier.pklos), 
                    condition(leg.tsakti = 1, dosier.tsla1,  dosier.tsua1) 

                from 
                    tsroma leg 
                    left outer join dosier 
                    on leg.dosvlg = dosier.dosvlg 
                where 
                    leg.tsrido = 79106279

                order by 2;

最終編集:

Visual Studio が条件の unims 構文を認識しないにもかかわらず、上記のコードは正しく動作します。サーバーによると、古いクエリがスタックし、サイズが 100 MB を超えたため、それらのプロセスが強制終了されました。10 年前のデータベースは実に奇妙なものです。

4

1 に答える 1

2

私は UniMS に詳しくありませんが、おそらく次のいずれかが機能するでしょう。

             (case when leg.tsakti = 1 then load.land else unload.land end), 
             (case when condition(leg.tsakti = 1 then load.postun else unload.postun end), 
             (case when condition(leg.tsakti = 1 then load.tsadr1 else unload.tsadr1 end) 

また:

             iif(leg.tsakti = 1, load.land, unload.land), 
             iif(leg.tsakti = 1, load.postun, unload.postun), 
             iif(leg.tsakti = 1, load.tsadr1, unload.tsadr1) 

また:

             if(leg.tsakti = 1, load.land, unload.land), 
             if(leg.tsakti = 1, load.postun, unload.postun), 
             if(leg.tsakti = 1, load.tsadr1, unload.tsadr1) 

これらは他のいくつかのデータベースで機能します。

于 2013-01-17T14:18:48.193 に答える