当我尝试在下面创建存储过程时,出现以下错误:
操作数类型冲突: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
答案 0 :(得分:18)
听起来好像这些表中至少有一个将UserID
定义为uniqueidentifier
,而不是int
。你检查过每张桌子的数据了吗?每个表的SELECT TOP 1 UserID FROM
产生什么? int
或GUID
?
修改强>
我认为您已经基于包含名为UserID的列的所有表构建了一个过程。我认为你不应该在你的脚本中包含aspnet_Membership
表,因为它不是真正的“你的”表。
如果您打算围绕aspnet_Membership
数据库设计表格,那么当该表明确使用int
uniqueidentifier
时,为什么其余列UserID
为{{1}}列?
答案 1 :(得分:2)
如果您通过视图然后try sp_recompile
or refreshing views.
sp_recompile
:
导致存储过程,触发器和用户定义函数在下次运行时重新编译。它通过从过程高速缓存中删除现有计划来强制在下次运行过程或触发器时创建新计划。在SQL Server Profiler集合中,将记录事件SP:CacheInsert而不是事件SP:Recompile。
<强>参数强>
[ @objname= ] 'object'
当前数据库中存储过程,触发器,表,视图或用户定义函数的限定或非限定名称。 object是nvarchar(776),没有默认值。如果object是存储过程,触发器或用户定义函数的名称,则存储过程,触发器或函数将在下次运行时重新编译。如果object是表或视图的名称,那么引用该表或视图的所有存储过程,触发器或用户定义函数将在下次运行时重新编译。
返回代码值
0(成功)或非零数字(失败)
<强>说明强>
sp_recompile
仅在当前数据库中查找对象。
存储过程,触发器和用户定义函数使用的查询仅在编译时才会进行优化。由于对数据库进行了影响统计的索引或其他更改,因此编译的存储过程,触发器和用户定义的函数可能会失去效率。通过重新编译作用于表的存储过程和触发器,您可以重新优化查询。
答案 2 :(得分:0)
原因是数据与数据类型不匹配。 我遇到了我忘记使字段匹配的相同问题。尽管我的情况与您的情况不同,但它显示了类似的错误消息。
这种情况是我复制了一个表,但是偶然地我拼错了一个字段,因此在创建数据库后使用ALTER
对其进行了更改。并且两个表中的字段顺序都不相同。因此,当我使用INSERT INTO TableName SELECT * FROM TableName
时,结果显示了类似的错误:Operand type clash: datetime is incompatible with uniqueidentifier
这是一个类似的例子:
use example
go
create table Test1 (
id int primary key,
item uniqueidentifier,
inserted_at datetime
)
go
create table Test2 (
id int primary key,
inserted_at datetime
)
go
alter table Test2 add item uniqueidentifier;
go
--insert into Test1 (id, item, inserted_at) values (1, newid(), getdate()), (2, newid(), getdate());
insert into Test2 select * from Test1;
select * from Test1;
select * from Test2;
错误消息是:
Msg 206, Level 16, State 2, Line 24
Operand type clash: uniqueidentifier is incompatible with datetime