Подтвердить что ты не робот

Столкновение типа операнда: 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
4b9b3361

Ответ 1

Мне кажется, что хотя бы одна из этих таблиц определила UserID как uniqueidentifier, а не int. Вы проверяли данные в каждой таблице? Что дает SELECT TOP 1 UserID FROM для каждой таблицы? int или GUID?

ИЗМЕНИТЬ

Я думаю, вы создали процедуру, основанную на всех таблицах, содержащих столбец с именем UserID. Я думаю, вы не должны были включать таблицу aspnet_Membership в свой script, так как это не действительно одна из "ваших" таблиц.

Если вы планируете создавать таблицы вокруг базы данных aspnet_Membership, то почему остальные столбцы int, когда эта таблица явно использует uniqueidentifier для столбца UserID?

Ответ 2

Если вы получаете доступ к этому через представление, тогда попробуйте sp_recompile или обновите представления.

sp_recompile:

Вызывает перекомпиляцию хранимых процедур, триггеров и пользовательских функций при следующем запуске. Это делается путем удаления существующего плана из кэша процедур, что заставляет создавать новый план при следующем запуске процедуры или триггера. В коллекции SQL Server Profiler событие SP: CacheInsert регистрируется вместо события SP: Recompile.

Аргументы

[ @objname= ] 'object'

Полное или неквалифицированное имя хранимой процедуры, триггера, таблицы, представления или пользовательской функции в текущей базе данных. объект nvarchar (776), без значения по умолчанию. Если объект - это имя хранимой процедуры, триггера или пользовательской функции, хранимая процедура, триггер или функция будут перекомпилированы при следующем запуске. Если объект является именем таблицы или представления, все хранимые процедуры, триггеры или пользовательские функции, которые ссылаются на таблицу или представление, будут перекомпилированы при следующем запуске.

Значения кода возврата

0 (успех) или ненулевое число (сбой)

Замечания

sp_recompile ищет объект только в текущей базе данных.

Запросы, используемые хранимыми процедурами, триггерами и пользовательскими функциями, оптимизируются только после их компиляции. Поскольку в базу данных вносятся индексы или другие изменения, влияющие на статистику, скомпилированные хранимые процедуры, триггеры и пользовательские функции могут потерять эффективность. Перекомпилировав хранимые процедуры и триггеры, которые действуют на таблицу, вы можете повторно оптимизировать запросы.

Ответ 3

Причина в том, что данные не соответствуют типу данных. Я сталкивался с теми же проблемами, что забыл привести поля в соответствие. Хотя мой случай не совпадает с вашим, он показывает похожее сообщение об ошибке.

Ситуация такова, что я копирую таблицу, но случайно ошибаюсь в написании одного поля, поэтому я изменяю его, используя 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