web-dev-qa-db-ja.com

オペランド型の衝突:uniqueidentifierはintと互換性がありません

以下のストアドプロシージャを作成しようとすると、次のエラーが表示されます。

オペランド型の衝突:uniqueidentifierはintと互換性がありません

このエラーの原因は明確ではありません。実際、UserIDはすべてのテーブルでintです。誰かが私が間違ったことを教えてくれますか?

create procedure dbo.DeleteUser(@UserID int)
as

    delete from [aspnet_Membership] where UserId = @UserID
    delete from [Subscription] where UserID = @UserID
    delete from [Address] where UserID = @UserID
    delete from [User] where UserID = @UserID

go
17
hughesdan

これらのテーブルの少なくとも1つがUserIDuniqueidentifierではなくintとして定義しているように思えます。各テーブルのデータを確認しましたか? SELECT TOP 1 UserID FROM各テーブルは何をもたらしますか? intまたはGUID

[〜#〜] edit [〜#〜]

UserIDという名前の列を含むすべてのテーブルに基づいてプロシージャを構築したと思います。スクリプトはaspnet_Membershipテーブルを含めるべきではないと思います。これは実際には「自分の」テーブルの1つではないからです。

aspnet_Membershipデータベースを中心にテーブルを設計する場合、そのテーブルがint列にuniqueidentifierを明確に使用しているのに、なぜ残りの列UserIDなのですか?

18
Aaron Bertrand

ビュー経由でこれにアクセスしている場合は、 try sp_recompileまたはビューの更新。

sp_recompile

ストアドプロシージャ、トリガー、およびユーザー定義関数は、次に実行されるときに再コンパイルされます。これは、プロシージャキャッシュから既存のプランを削除して、次にプロシージャまたはトリガが実行されたときに新しいプランを強制的に作成することによって行われます。 SQL Server Profilerコレクションでは、イベントSP:Recompileの代わりにイベントSP:CacheInsertが記録されます。

引数

[ @objname= ] 'object'

現在のデータベース内のストアドプロシージャ、トリガー、テーブル、ビュー、またはユーザー定義関数の修飾名または非修飾名。オブジェクトはnvarchar(776)であり、既定値はありません。 objectがストアドプロシージャ、トリガー、またはユーザー定義関数の名前である場合、ストアドプロシージャ、トリガー、または関数は、次回の実行時に再コンパイルされます。 objectがテーブルまたはビューの名前である場合、テーブルまたはビューを参照するすべてのストアドプロシージャ、トリガー、またはユーザー定義関数は、次回の実行時に再コンパイルされます。

リターンコード値

0 (success) or a nonzero number (failure)

備考

sp_recompileは、現在のデータベースでのみオブジェクトを探します。

ストアドプロシージャ、またはトリガー、およびユーザー定義関数で使用されるクエリは、コンパイル時にのみ最適化されます。統計に影響を与えるインデックスまたはその他の変更がデータベースに加えられると、コンパイルされたストアドプロシージャ、トリガー、およびユーザー定義関数が効率を失う可能性があります。テーブルで動作するストアドプロシージャとトリガーを再コンパイルすると、クエリを再最適化できます。

2
user280868