Stored procedure error: "Error converting data type nvarchar to uniqueidentifier"

Stored procedure error: "Error converting data type nvarchar to uniqueidentifier"

所以我是创建 SP 的新手,现在我正在尝试创建一个 SP 以将值插入到我下面的 table 报告中。

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', 'evdawson@gmail.com', GETDATE

正确执行 SP 后出现以下错误:

Msg 8114, Level 16, State 5, Procedure spInsertOrUpdate, Line 0 Error converting data type nvarchar to uniqueidentifier

有人可以帮我解决这个问题吗?

我将从正确调用函数开始:

EXEC spInsertOrUpdate NEWID(), 'Evlyn Dawson', 'evdawson@gmail.com', GETDATE();

NEWID()GETDATE() 是函数,所以你需要在它们后面加上括号。

但是,我认为缺少括号不会导致该特定错误。您需要先设置变量,然后将它们用于 exec.

编辑:

更好的方法是自动设置 ID 和日期:

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', 'evdawson@gmail.com';

我也不鼓励您在 table 中使用唯一标识符作为主键。它们相当低效,因为它们会导致页面碎片。请改用 identity 列。

这个错误信息有点像徒劳,问题是 NEWID()GETDATE() 都是函数,所以需要括号。不幸的是,您不能将函数作为参数传递给存储过程,因此您首先需要将值分配给变量:

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

EXEC #spInsertOrUpdate @ID, 'Evlyn Dawson', 'evdawson@gmail.com', @Date;

顺便说一句,a UNIQUEIDENTIFIER column is a very poor choice for a clustering key

因此,如果您只是使用 getdate 和 newid 调用存储过程,为什么不将它们添加为默认值 table?

Table

  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', 'evdawson@gmail.com'

编辑 另请注意,您的 lastchanged 列的类型为 DATE,但是如果您想要带有时间戳的日期,则应使用 datetime

感谢您 help.I 终于找到了在 SP 中执行此操作的正确方法 我对 SP 有了正确的理解 now.This 是我解决问题的方法

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','evdawson@gmail.com','Ferrari'

请注意,我还有一个 CARS 专栏