2016-04-14 7 views
0

DelphiでSQL ServerとADOを使用しており、レポートプログラムで使用する一時テーブルを作成しています。表中の テーブルスキーマの変更があります

  • 書き込みデータを「テーブルを作成し、」SQLクエリでテーブルを作成します

    1. プログラムの流れはこのようなものです。

    2. SQLクエリによるテーブルの削除。

    これは通常動作しますが、一部のお客様は「ドロップテーブル」が「無効なオブジェクト名」というエラーで失敗することを定期的に訴えています。

    私は、顧客データベースへのリモートアクセスを得ることができる、と私は、次の見た:

    • をテーブルXは(デルファイで)一覧表に示されているDelphiで
    • 、テーブルを開いたりすることができません削除されました。
    • テーブルスキーマは "dbo"ではなく "Server \ 1"です。

    このテーブルのテーブルスキーマはどのように変更できますか?この問題はどのように処理する必要がありますか?なぜそれは時々、時にはうまくいかないのですか?

  • +2

    dboスキーマで一時テーブルを作成する代わりに、テンポラリテーブル(例:#TempTable)を使用する方が効果的です。他のユーザには表示されません(MS SQLサーバはその名前に一意の接尾辞を追加します)。 – kobik

    +2

    (1)スキーマを明示的に指定せずにテーブルを作成すると、デフォルトが割り当てられます。 (2)デフォルトは、テーブルの作成時にログインしたユーザによって異なります。 **解決法**単に明示的にしてください。 –

    +0

    非常に大きなコードベースを持っているので、すべてのSQLクエリーを '[dbo]'プレフィックスに変更するのは非常に難しいでしょう。しかし、私は "CREATE TABLE"のすべての出現箇所を検索して見つけ出し、それらを変更することができました。これは使えますか? –

    答えて

    1

    一時テーブルを使用して、関連するすべてのコードをSQLに保存することをお勧めします。別のクエリで

    IF OBJECT_ID('tempdb..#YourTable') IS NOT NULL 
    DROP TABLE ##YourTable; -- just a precaution if it's already there 
    
    SELECT <field list> 
    into #YourTable -- this creates a the table with the structure of the "select" dataset 
    from YourSource_table 
    join Another_table on <join conditions> 
    where <your selection conditions>; 
    

    SELECT <field list> from #YourTable; 
    

    、レポートを作成し、あなたの一時テーブルからデータを読み込みます。すべて完了すると は、一時テーブルに単一のセッション内のアクセス

    IF OBJECT_ID('tempdb..#YourTable') IS NOT NULL 
    DROP TABLE ##YourTable; 
    

    一時テーブルをドロップします。つまり、作成して同じ接続コンポーネントから読み込み、間に開いたままにしておく必要があります。

    +0

    一時テーブルは面白いので、いつか他の文脈で使うかもしれない。しかし、データ提供アプリケーションとレポートソフトウェア(クリスタルレポート)は2つの異なるプログラムであり、接続を共有しないため、この場合はおそらく動作しません。(または、私はまだその機能が見つかりませんでした) –

    +0

    グローバル一時テーブルを使用することができます。構文は似ていますが、## YourTempTableのように単一ハッシュを二重ハッシュに変更するだけです。一度に1人のユーザーしかレポートを呼び出さないようにする必要があります。そうしないと面白い結果が得られる可能性があります。 – user6150786

    関連する問題