Ошибка хранимой процедуры: ошибка преобразования типа данных nvarchar в uniqueidentifier

Итак, я новичок в создании SP, и прямо сейчас я пытаюсь создать SP для вставки значений в свой табличный отчет ниже.

CREATE TABLE Report (
    ID UNIQUEIDENTIFIER PRIMARY KEY NOT NULL,
    STAFF VARCHAR(1000)NOT NULL,
    EMAIL VARCHAR(1000)NOT NULL,
    LASTCHANGE DATE NOT NULL
)

CREATE PROCEDURE spInsertOrUpdate(
    @ID UNIQUEIDENTIFIER,
    @STAFF VARCHAR(1000),
    @EMAIL VARCHAR(1000),
    @LASTCHANGE DATETIME
) AS
BEGIN
    INSERT INTO Report(ID, STAFF, EMAIL, LASTCHANGE)
        VALUES(@ID, @STAFF, @EMAIL, @LASTCHANGE)
END

EXEC spInsertOrUpdate NEWID, 'Evlyn Dawson', '[email protected]', GETDATE

Сразу после выполнения SP я следующая ошибка:

Msg 8114, уровень 16, состояние 5, процедура spInsertOrUpdate, строка 0 Ошибка преобразования типа данных nvarchar в uniqueidentifier

Может кто-нибудь помочь мне с этой проблемой?


person Emesh Ransinghe    schedule 25.10.2017    source источник
comment
Я всегда получаю эту ошибку, когда добавляю круглые скобки для NEWID ИЛИ GETDATE: неправильный синтаксис рядом с ')'   -  person Emesh Ransinghe    schedule 25.10.2017


Ответы (4)


Итак, если вы просто вызываете свою хранимую процедуру с помощью getdate и newid, почему бы вам просто не добавить их по умолчанию в свою таблицу?

Таблица

  CREATE TABLE [dbo].[Report](
    [ID] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Report_ID]  DEFAULT (newid()),
    [STAFF] [varchar](1000) NOT NULL,
    [EMAIL] [varchar](1000) NOT NULL,
    [LASTCHANGE] [datetime] NOT NULL CONSTRAINT [DF_Report_LASTCHANGE]  DEFAULT (getdate()),
 CONSTRAINT [PK__Report__3214EC27D2D8BF72] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Процедура

create PROCEDURE spInsertOrUpdate(

@STAFF VARCHAR(1000),
@EMAIL VARCHAR(1000)

) AS
BEGIN
INSERT INTO Report(STAFF, EMAIL)
    VALUES(@STAFF, @EMAIL)
END

Выполнить инструкцию

EXEC spInsertOrUpdate  'Evlyn Dawson', '[email protected]'

Изменить. Также обратите внимание, что ваш последний измененный столбец имеет тип DATE, однако, если вам нужна дата с отметкой времени, вы должны использовать datetime.

person SqlKindaGuy    schedule 25.10.2017

Это сообщение об ошибке похоже на погоню за диким гусем, проблема в том, что и NEWID(), и GETDATE() являются функциями, поэтому требуются круглые скобки. К сожалению, вы не можете передать функцию в качестве параметра хранимой процедуре, поэтому вам сначала нужно присвоить значения переменной:

DECLARE @ID UNIQUEIDENTIFIER = NEWID(),
        @Date DATE = GETDATE();

EXEC #spInsertOrUpdate @ID, 'Evlyn Dawson', '[email protected]', @Date;

Кроме того, UNIQUEIDENTIFIER столбец очень плохой выбор для ключа кластеризации

person GarethD    schedule 25.10.2017

Я бы начал с правильного вызова функций:

EXEC spInsertOrUpdate NEWID(), 'Evlyn Dawson', '[email protected]', GETDATE();

NEWID() и GETDATE() - это функции, поэтому вам нужны скобки после них.

Однако я не думаю, что отсутствие круглых скобок может вызвать именно эту ошибку. Вам нужно сначала установить переменные, а затем использовать их для exec.

РЕДАКТИРОВАТЬ:

Лучше всего установить идентификаторы и даты автоматически:

CREATE TABLE Report (
    ID UNIQUEIDENTIFIER PRIMARY KEY NOT NULL DEFAULT NEWID(),
    STAFF VARCHAR(1000) NOT NULL,
    EMAIL VARCHAR(1000) NOT NULL,
    LASTCHANGE DATE NOT NULL DEFAULT GETDATE()
);

CREATE PROCEDURE spInsertOrUpdate (
    @STAFF VARCHAR(1000),
    @EMAIL VARCHAR(1000)
) AS
BEGIN
    INSERT INTO Report(STAFF, EMAIL)
        VALUES (@STAFF, @EMAIL)
END;

EXEC spInsertOrUpdate 'Evlyn Dawson', '[email protected]';

Я бы также отговорил вас от использования уникальных идентификаторов в качестве первичных ключей в таблице. Они довольно неэффективны, так как могут привести к фрагментации страницы. Вместо этого используйте столбец identity.

person Gordon Linoff    schedule 25.10.2017
comment
Есть ли проблема с моим SP или с тем, как я его вызываю? Причина, когда я использую обычный запрос INSERT, моя таблица принимает эти значения и работает. Кроме того, круглые скобки выдают ошибку всякий раз, когда я пытаюсь добавить их в свой оператор EXECUTION - person Emesh Ransinghe; 25.10.2017
comment
Большое спасибо. Это действительно помогло - person Emesh Ransinghe; 25.10.2017

Спасибо за вашу помощь. Наконец-то я нашел правильный способ сделать это в рамках SP, и теперь я получил правильное представление о SP. Вот как я решил проблему

CREATE PROCEDURE spInsertOrUpdate(@STAFF VARCHAR(1000),@EMAIL VARCHAR(1000),@CARS VARCHAR(1000))

AS
BEGIN
INSERT INTO Report(ID,STAFF,EMAIL,CARS,LASTCHANGE)
VALUES(NEWID(),@STAFF,@EMAIL,@CARS,GETDATE())
END

EXEC spInsertOrUpdate 'Evlyn Dawson','[email protected]','Ferrari'

Обратите внимание, что у меня также есть столбец АВТОМОБИЛИ

person Emesh Ransinghe    schedule 26.10.2017
comment
Я действительно не хотел оставлять свою таблицу со значениями по умолчанию NEWID и GETDATE. Я хотел как-то передать эти функции моему SP. Спасибо всем за полезные ответы, мне удалось это сделать. Спасибо !! - person Emesh Ransinghe; 26.10.2017