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 专栏
所以我是创建 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 专栏