0

一連のファイルをクエリしようとしています。15 のうち、クエリを実行する必要があるのは 3 つです。メッセージ 7314、レベル 16、状態 1、行 1 リンク サーバー "サーバー名" の OLE DB プロバイダー "IBMDASQL" には、テーブル "system. lib.file". テーブルが存在しないか、現在のユーザーがそのテーブルに対する権限を持っていません。

私は SQL を使用しており、IBMDASQL ドライバーを使用してリンク サーバーを作成しました。

私が言ったように、15 個のファイルのうち 3 個のファイルだけがこの問題を引き起こしています。

ファイルに対して wrkobj を実行すると、パブリックにすべてのアクセス許可があることがわかり、念のため特定のユーザー アカウントを追加しました。

基本的な ODBC と Microsoft クエリを使用して接続すると、リストにファイルが表示されません。iSeries に直接ログインすると、ファイルを表示して操作できます。.

現在、代替ファイル名を使用しています。しかし、挿入エラーが発生します。尋ねられたように、ここにコードがあり、正確なエラーの下にあります。

INSERT INTO [PARKWAY-TRAIN].S60017.ORDERF912.NC_NURS_ORD_REF 
(RECORD_ID, NURSING_ORDER_CD, ORDER_DESCRIPTION, LONG_DESCRIPTION, ORDER_TYPE, FREQUENCY_CD, FREQ_PM_MAINT, NOTE_REQUIRED_STS, NOTE_TEMPLATE, TPL_STATUS, FORM_ID, PARAMETER_ID, COSIG_REQ)
SELECT STND.RECORD_ID, STND.NURSING_ORDER_CD, STND.ORDER_DESCRIPTION, STND.LONG_DESCRIPTION, STND.ORDER_TYPE, STND.FREQUENCY_CD, STND.FREQ_PM_MAINT, STND.NOTE_REQUIRED_STS, STND.NOTE_TEMPLATE, STND.TPL_STATUS, STND.FORM_ID, STND.PARAMETER_ID, STND.COSIG_REQ
FROM [MODEL2].TNICLN2.ORDERF143.NC_NURS_ORD_REF STND
WHERE STND.RECORD_ID <> 'D' AND NOT EXISTS (SELECT HOSP.NURSING_ORDER_CD FROM [PARKWAY-TRAIN].S60017.ORDERF912.NC_NURS_ORD_REF HOSP WHERE HOSP.NURSING_ORDER_CD = STND.NURSING_ORDER_CD)

エラー メッセージ: リンク サーバー "PARKWAY-TRAIN" の OLE DB プロバイダー "IBMDASQL" がメッセージ "SQL0104: トークン . が無効でした。 有効なトークン: . 原因 . . . . : トークン .. トークンで構文エラーが検出されました. は有効なトークンではありません. 有効なトークンの部分的なリストは です. このリストは、ステートメントがトークンまで正しいことを前提としています. エラーはステートメントの前にある可能性がありますが、ステートメントの構文はこれまで有効であるように見えます. point. リカバリ . . . : 次のうち 1 つ以上を実行し、要求を再試行してください: -- トークンの領域にある SQL ステートメントを確認してください.. ステートメントを修正してください. エラーは、コンマまたは引用符が欠落している可能性があります。単語のつづりが間違っているか、句の順序に関連している可能性があります。 -- エラー トークンが の場合、有効な句で終わっていないため、SQL ステートメントを修正してください。". メッセージ 7343、レベル 16、状態 2、行 1 リンク サーバー "PARKWAY-TRAIN" の OLE DB プロバイダー "IBMDASQL" could not INSERT INTO table "[PARKWAY -TRAIN].[S60017].[ORDERF912].[NC_NURS_ORD_REF]".

コードの Select 部分だけを実行すると、正確には 503 行が返されます。コードの挿入部分をスローした場合にのみ失敗します。

IBM は、トークンを修正するように言います。ただし、どのトークンを修正するのが間違っているかについての手がかりはありません。

4

1 に答える 1

0

「テーブルが見つかりません」というエラーは非常に疑わしいものです。STRSQL の使用:

select table_name, table_schema, 
base_table_name, base_table_schema, base_table_member, 
system_table_name, system_table_schema 
from systables 
where table_name = 'NC_NURS_ORD_REF'

ライブラリー ORDERF912 内の NC_NURS_ORD_REF という名前のテーブルが、ライブラリー ORDERF912 内のシステム テーブル名 NCORDER に実際に関連付けられていることを確認してください。

構文エラーも同様に疑わしいです。これがクロスシステム クエリであることを考えると、IBM i STRSQL コマンドからそのまま実行できるとは思えません。これは、適切なマルチシステム データベース構成が i 側でセットアップされていることを意味します。

同様の問題を抱えている人を見つけましたが、Microsoft 側にあるようです: http://bytes.com/topic/db2/answers/447753-error-inserting-into-iseries-db2-table-long-name-via -sql-server-2000-linked-server 彼の回避策は OPENQUERY() フォームを使用することだったと思います。

IBM i 側で確実に確認できることの 1 つは、ORDERF912.NC_NURS_ORD_REF に対してジャーナリングがオンになっているかどうかです。適切なコミット レベルを使用する必要があるため、これは重要です。SYSTABLES に対する前のクエリの結果を取得し、SYSTEM_TABLE_NAME を使用して DSPFD を実行します。「ファイルは現在ジャーナル処理されています」というテキストを探します。表がジャーナル処理されていない場合、いくつかの選択肢があります。ファイルのジャーナリングを開始するのが最善の選択ですが、それが利用できない場合は、INSERT... WITH NC を試してください。または、ドライバーでコミットメント制御をオフにします。

また、次の IBM 技術情報を参照して、リンク サーバーが正しく設定されていることを確認してください: http://www-01.ibm.com/support/docview.wss?uid=nas8N1014514

于 2014-07-24T14:52:51.573 に答える