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