操作数类型冲突:uniqueidentifier与int不兼容。

28

当我尝试创建下面的存储过程时,出现了以下错误:

操作数类型冲突: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

3
aspnet_Membership肯定使用guids吧? - Martin Smith
3个回答

27
听起来至少其中一个表将UserID定义为uniqueidentifier而不是int。您检查了每个表中的数据吗?执行 SELECT TOP 1 UserID FROM 每个表,返回的是int还是GUID? 编辑 我认为您基于包含列名为UserID的所有表构建了一个过程。我认为您不应该在脚本中包含aspnet_Membership表,因为它并不是您的表之一。
如果您打算围绕aspnet_Membership数据库设计您的表,那么其他列为什么都是int,当该表明显使用uniqueidentifier作为UserID列时呢?

1
啊,是的...就是这样。会员表将其存储为GUID。有些尴尬。 - hughesdan
如果您要将自己的UserID定义与成员提供程序混合使用,也许将标识符命名为其他名称可能更有意义。 - Aaron Bertrand
确实,这是我糟糕的设计决策。 - hughesdan

4
如果您是通过视图访问此内容的,请尝试使用 sp_recompile 或刷新视图。

sp_recompile:

会导致存储过程、触发器和用户定义的函数在下次运行时重新编译。它通过从过程缓存中删除现有计划来强制创建新计划,以便在下次运行过程或触发器时创建新计划。在 SQL Server Profiler 集合中,事件 SP:CacheInsert 被记录,而不是事件 SP:Recompile。

参数

[ @objname= ] 'object'

在当前数据库中,存储过程、触发器、表、视图或用户定义函数的合格或不合格名称。对象为nvarchar(776),无默认值。如果对象是存储过程、触发器或用户定义函数的名称,则在下次运行时将重新编译存储过程、触发器或函数。如果对象是表或视图的名称,则引用该表或视图的所有存储过程、触发器或用户定义函数都将在下次运行时重新编译。
返回代码值
0(成功)或非零数(失败)
备注
sp_recompile仅查找当前数据库中的对象。
只有在编译时,才会对存储过程、触发器和用户定义函数使用的查询进行优化。随着对数据库进行索引或其他影响统计信息的更改,已编译的存储过程、触发器和用户定义函数可能会失去效率。通过重新编译作用于表的存储过程和触发器,您可以重新优化查询。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接