存储过程:创建后无法执行
Stored Procedure: Unable to execute after creation
我创建了一个存储过程,它做四件事:
- 创建 table
- 用新列
更改创建的table
- 根据条件更新新列
- 再次更改 table 以删除一列。
我创建了存储过程但无法执行。我得到这个错误
Column name or number of supplied values does not match table definition'
我已经检查了所有列及其数据类型以确保它们匹配,所以我不知道哪里出了问题。这是我第一次写存储过程,所以可能是我的代码结构完全错误。我在这里附上了一个显示基本结构的简化代码,我希望有人可以看看结构是否正确并阐明一些信息!
非常感谢
米歇尔
SET ANSI_NULLS ON
GO
CREATE PROCEDURE myStoredProcedure
AS
BEGIN
SET NOCOUNT ON
IF OBJECT_ID('newTable') IS NULL
BEGIN
CREATE TABLE newTable
(
[name] [nvarchar] (256) NOT NULL,
[id] [int] NOT NULL,
[date] [datetime2] (7) NULL
)
END;
TRUNCATE TABLE newTable;
INSERT INTO newTable
SELECT [name], [id], [date]
FROM table1;
ALTER TABLE newTable
ADD [Flag] [nvarchar](2) NULL;
UPDATE newTable
SET [Flag] = 1
WHERE YEAR([date]) = 2020;
ALTER TABLE newTable
DROP COLUMN [date];
END;
根据 Guru 上面的评论,而是创建 table,因为它最初应该创建,然后根据您的 SP 相应地更新其中的数据。
我修改了你的 SP 来工作,但是,这仍然不是实际使用 SP 的正确方法。
见下面修改后的 SP:
SET ANSI_NULLS ON
GO
CREATE PROCEDURE myStoredProcedure
AS
BEGIN
SET NOCOUNT ON
IF OBJECT_ID('newTable') IS NULL
BEGIN
CREATE TABLE newTable
(
[id] int primary key identity,
[name] nvarchar(256) NOT NULL,
[date] datetime2 (7) NULL ,
[Flag] nvarchar(2) NULL
)
END;
INSERT INTO newTable (
[name],
[date]
)
SELECT
[name],
[date]
FROM table1;
UPDATE newTable
SET [Flag] = 1
WHERE YEAR([date]) = 2020;
END;
我删除了删除日期列的代码,因为这是不明智的。
我创建了一个存储过程,它做四件事:
- 创建 table
- 用新列 更改创建的table
- 根据条件更新新列
- 再次更改 table 以删除一列。
我创建了存储过程但无法执行。我得到这个错误
Column name or number of supplied values does not match table definition'
我已经检查了所有列及其数据类型以确保它们匹配,所以我不知道哪里出了问题。这是我第一次写存储过程,所以可能是我的代码结构完全错误。我在这里附上了一个显示基本结构的简化代码,我希望有人可以看看结构是否正确并阐明一些信息!
非常感谢
米歇尔
SET ANSI_NULLS ON
GO
CREATE PROCEDURE myStoredProcedure
AS
BEGIN
SET NOCOUNT ON
IF OBJECT_ID('newTable') IS NULL
BEGIN
CREATE TABLE newTable
(
[name] [nvarchar] (256) NOT NULL,
[id] [int] NOT NULL,
[date] [datetime2] (7) NULL
)
END;
TRUNCATE TABLE newTable;
INSERT INTO newTable
SELECT [name], [id], [date]
FROM table1;
ALTER TABLE newTable
ADD [Flag] [nvarchar](2) NULL;
UPDATE newTable
SET [Flag] = 1
WHERE YEAR([date]) = 2020;
ALTER TABLE newTable
DROP COLUMN [date];
END;
根据 Guru 上面的评论,而是创建 table,因为它最初应该创建,然后根据您的 SP 相应地更新其中的数据。
我修改了你的 SP 来工作,但是,这仍然不是实际使用 SP 的正确方法。
见下面修改后的 SP:
SET ANSI_NULLS ON
GO
CREATE PROCEDURE myStoredProcedure
AS
BEGIN
SET NOCOUNT ON
IF OBJECT_ID('newTable') IS NULL
BEGIN
CREATE TABLE newTable
(
[id] int primary key identity,
[name] nvarchar(256) NOT NULL,
[date] datetime2 (7) NULL ,
[Flag] nvarchar(2) NULL
)
END;
INSERT INTO newTable (
[name],
[date]
)
SELECT
[name],
[date]
FROM table1;
UPDATE newTable
SET [Flag] = 1
WHERE YEAR([date]) = 2020;
END;
我删除了删除日期列的代码,因为这是不明智的。