1

現在、職場の内部プロセスに独自のパーソナライズされたクエリを使用する約 10 人のユーザーがいます。ユーザーがクエリの先頭にいくつかの値を入力し、実行をヒットすると、そのレポートがグリッドに表示されます。それらがアクセスするソース データ テーブルは同じですが、作成されたテーブルはサフィックス _User1、_User2...User10 でパーソナライズされています。クエリを実行するたびに、以前に作成されたテーブルが削除され、再度作成されます。クエリ全体の実行には約 1 秒かかります。

構造の大部分は、目的の出力に到達するために 5 つのステップで 5 回繰り返される次のようになります。

DROP TABLE z
SELECT *
INTO z
FROM y

現在、ユーザー数は 50 人に増えています。つまり、マスター クエリ コードを微調整するたびに、50 のユーザー固有のクエリを変更して送り返すことになります。10 人のユーザーでは扱いやすく煩わしく、50 人のユーザーでは完全に扱いにくくなります。

私の質問は、データベース/クエリを構築するための最良の方法は何ですか? 理想的には、1 つのクエリ、作成されたテーブルの 1 つのセット (50 ではありません) だけが必要です。実行に 1 秒しかかからないため、2 人以上のユーザー (入力が異なる) が同時にクエリを実行し、同じテーブルにアクセスして、まったく同時に実行したため、何らかの形で不適切なデータを取得する危険性がありますか?

これが通常行われる特定の方法はありますか?誰かが光を当てることができることを願っています。

ありがとう

4

1 に答える 1

2

免責事項: コメントで示したように、多数のユーザーに SSMS に直接アクセスしてレポートを実行することは非常に悪い考えです。たとえば、単純な MS Access データベースであっても、何らかのフロントエンドを取得します。たとえば、データベースを開発するために必要なライセンスは 1 つだけで、残りのユーザーには Access ランタイムを提供できます。ユーザーが何をしているのかわからない場合、ユーザーが本当に混乱させる方法はたくさんあります。以下にいくつかのアイデアを提供しますが、これを行うことはお勧めしません


1 つの解決策: 一時テーブルを使用して、各ユーザーのテーブルが重複することを心配する必要がないようにします。

-- drop the table if it already exists
if object_id('tempdb..#z') is not null
    DROP TABLE #z

SELECT *
INTO #z
FROM y

テーブル名の前に を付ける#と、接続スコープの一時テーブルになります。つまり、別のセッションでは、同じ名前であっても他のセッションの一時テーブルが表示されません。


非常に複雑なシナリオでない限り、多くの場合、一時テーブルを作成する必要はありません。サブクエリ、ビュー、CTE、およびストアド プロシージャを利用して、新しいテーブルを使用せずにリアルタイムで出力を生成できる必要があります。他のビューを参照するビューやプロシージャを作成して、複雑なロジックを整理することもできます。たとえば、次のようにロジックをストアド プロシージャにカプセル化できます。

CREATE PROCEDURE TheReport
(
    @ReportID int,
    @Name varchar(50),
    @SomeField varchar(10)
)
AS
BEGIN
    -- do some complicated query here
    SELECT field1, field2 FROM Result Q
END

その後、ユーザーに更新を送信する必要さえありません (フィールドが変更されない限り)。クエリにストアド プロシージャを呼び出すだけで、都合のよいときにプロシージャを直接更新できます。

DECLARE @ReportID int
DECLARE @Name varchar(50)
DECLARE @SomeField varchar(10)

-- YOU CAN MODIFY THIS --
SET @ReportID = 5
SET @Name = 'MyName'
SET @SomeField = 'abc'
-- DON'T MODIFY BELOW THIS LINE --

EXEC [TheReport] @ReportID, @Name, @SomeField;
于 2013-02-27T22:53:26.960 に答える