0

このことを考慮:

CREATE PROCEDURE [dbo].[setIdentifier](@oldIdentifierName as varchar(50), @newIdentifierName as varchar(50))
AS
BEGIN
    DECLARE @old_id as int;
    DECLARE @new_id as int;

    SET @old_id = (SELECT value FROM Configuration WHERE id = @oldIdentifierName);
    SET @new_id = (SELECT value FROM Configuration WHERE id = @newIdentifierName);

    IF @old_id IS NOT NULL AND @new_id IS NOT NULL
    BEGIN
        UPDATE Customer
        SET type = @new_id
        WHERE type = @old_id;
    END; 
END

[...]

EXECUTE dbo.setIdentifier '1', '2';

これにより、Customer テーブルの更新に使用する 2 つのパラメーターを受け入れるストアド プロシージャが作成されます。

問題は、上記のスクリプト全体が「dbo」以外のスキーマ内で実行されることです。スキーマが「company1」であると仮定しましょう。ストアド プロシージャが呼び出されると、SELECT ステートメントから、構成テーブルが見つからないというエラーが表示されます。これは、MS SQL が既定でストアド プロシージャの場所と同じスキーマ内でテーブルを検索し、呼び出し元のコンテキスト内では検索しないためだと思います。

私の質問はこれです:

  1. MS SQLに、プロシージャ自体が格納されているスキーマ内ではなく、「呼び出し元のデフォルトスキーマ」内のテーブルを探すように指示するオプション、パラメータ、またはスイッチはありますか?
  2. そうでない場合、何をお勧めしますか?テーブルにスキーマ名のプレフィックスを付けたくありません。これを行うと柔軟性がなくなるからです。したがって、動的SQL(およびプロシージャ内でも正しい値を返すschema_name()関数)を使用することを考えていますが、適切な構文を構築するのに十分なMS SQLの経験がありません.
4

2 に答える 2

0

スキーマ名を明示的に指定する方が少し効率的です。そして一般的に言えば、スキーマは主にデータベースを論理的な領域に分割するために使用されます。テーブルのスキーマ ホッピングが頻繁に行われるとは考えていません。

あなたの質問に関しては、実行コンテキストを明示的に制御できるため、msdn の「 execute as 」ドキュメントをご覧になることをお勧めします。

于 2013-06-04T08:17:43.147 に答える
0

「sqlcmd」コマンドのコマンドラインのプロパティとして、スキーマ名をスクリプトに渡すことになりました。このような:

C:/> sqlcmd -vSCHEMANAME=myschema -imysqlfile

SQL スクリプトでは、次のようにこの変数にアクセスできます。

SELECT * from $(SCHEMANAME).myTable WHERE.... etc

動的SQLほど柔軟ではありませんが、「十分」です。

返信に時間を割いていただきありがとうございます。

于 2013-06-07T12:38:36.367 に答える