Visual Studio を使用せずにマネージ ストアド プロシージャをデプロイするにはどうすればよいですか?
-
02-07-2019 - |
質問
私が読んだすべての内容には、マネージ ストアド プロシージャを作成するときに、Visual Studio で右クリックして [デプロイ] を選択する必要があると記載されています。これは問題なく動作しますが、これを Visual Studio の外部のさまざまな場所にデプロイしたい場合はどうすればよいでしょうか?プロジェクトが SQL で構築した DLL を使用してアセンブリを作成しようとしましたが、アセンブリは追加されましたが、アセンブリからプロシージャは作成されませんでした。Visual Studio を使用せずに SQL で直接これを行う方法を考え出した人はいますか?
解決
アセンブリ DLL ファイルをさまざまなサーバーのローカル ドライブにコピーします。次に、アセンブリをデータベースに登録します。
create assembly [YOUR_ASSEMBLY]
from '(PATH_TO_DLL)'
...次に、DLL 内の適切なパブリック メソッドを参照する関数を作成します。
create proc [YOUR_FUNCTION]
as
external name [YOUR_ASSEMBLY].[NAME_SPACE].[YOUR_METHOD]
特に NAME_SPACE の周囲では、必ず [ 括弧を使用してください。名前空間には任意の数のドットを含めることができますが、SQL 識別子には、各部分が角かっこで明示的に区切られていない限り、含めることはできません。私が初めて SQL CLR を使用したとき、これは多くの悩みの種でした。
明確にしておきますが、[YOUR_ASSEMBLY] は SQL で定義した名前です。[NAME_SPACE] は、メソッドが存在する DLL 内の .NET 名前空間です。[YOUR_METHOD] は単にその名前空間内のメソッドの名前です。
他のヒント
上記の @kcrumley の回答にさらに詳細/明確化を追加するには:
[NAME_SPACE] は完全修飾です 型名 名前空間だけではありません
- つまりあなたのクラスが呼び出された場合 StoredProcedures
の名前空間内 My.Name.Space
, を使用する必要があります [My.Name.Space.StoredProcedures]
[NAME_SPACE] 部分。
マネージド ストアド プロシージャが名前空間が定義されていないクラスにある場合は、そのままのクラス名を使用するだけです (例: [StoredProcedures]
).
また、引数/パラメーターを使用してプロシージャを追加する方法を理解するのに少し苦労しました。それで、そうしようとしている他の人のためにサンプルをここに示します。
CREATE PROCEDURE [YOUR_FUNCTION]
(
@parameter1 int,
@parameter2 nvarchar
)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [YOUR_ASSEMBLY].[StoredProcedures].[YOUR_FUNCTION]