更改更改 table 的存储过程
Altering stored procedure that ALTERs a table
我有一个程序按顺序执行以下操作
- 使用单列创建 table
- 在 table
中插入数据
- 向 table
添加更多列
SP 第一次执行后,table 已经存在。因此,如果我在 SP 中进行更改并尝试保存它,它会在插入步骤中抛出一个错误,说
"Column name or number of supplied values does not match table definition."
有什么方法可以禁用此 'check' 并以某种方式更新 SP 而不必删除 table?
编辑:这个 SP 应该 运行 每年只生成一次报告。直到明年才会有人关注它。实际上,有一组 5-6 个存储过程生成所有 tables(大约 25 个),然后用于制作报告。因此,当在 SP 中进行更改时,table 将被删除,所有 SP 将再次 运行。
示例:
CREATE proc sp_temp
AS
BEGIN
BEGIN TRY DROP TABLE TX END TRY BEGIN CATCH END CATCH
CREATE TABLE TX (ID INT)
DECLARE @I INT =0
WHILE (@I<=10)
BEGIN
INSERT INTO TX VALUES (@I)
SET @I += 1
END
ALTER TABLE TX ADD COL1 VARCHAR(10)
INSERT INTO TX VALUES (11, 'SOME TEXT');
END
EDIT2:Table 在创建之前被删除。
但现在我的问题是:SSMS 识别错误即。提供的列数和值数不匹配,但为什么看不到 table 被删除?
答案是"no"。如果你真的必须这样做,那么我建议使用动态SQL,并执行它。
这听起来绝对是糟糕的设计。
ALTER proc [dbo].[sp_temp]
AS
BEGIN
CREATE TABLE TX (ID INT)
DECLARE @I INT =0
WHILE (@I<=10)
BEGIN
INSERT INTO TX(ID) VALUES (@I)
SET @I += 1
END
ALTER TABLE TX ADD COL1 VARCHAR(10)
INSERT INTO TX VALUES (11, 'SOME TEXT');
END
我有一个程序按顺序执行以下操作
- 使用单列创建 table
- 在 table 中插入数据
- 向 table 添加更多列
SP 第一次执行后,table 已经存在。因此,如果我在 SP 中进行更改并尝试保存它,它会在插入步骤中抛出一个错误,说 "Column name or number of supplied values does not match table definition."
有什么方法可以禁用此 'check' 并以某种方式更新 SP 而不必删除 table?
编辑:这个 SP 应该 运行 每年只生成一次报告。直到明年才会有人关注它。实际上,有一组 5-6 个存储过程生成所有 tables(大约 25 个),然后用于制作报告。因此,当在 SP 中进行更改时,table 将被删除,所有 SP 将再次 运行。
示例:
CREATE proc sp_temp
AS
BEGIN
BEGIN TRY DROP TABLE TX END TRY BEGIN CATCH END CATCH
CREATE TABLE TX (ID INT)
DECLARE @I INT =0
WHILE (@I<=10)
BEGIN
INSERT INTO TX VALUES (@I)
SET @I += 1
END
ALTER TABLE TX ADD COL1 VARCHAR(10)
INSERT INTO TX VALUES (11, 'SOME TEXT');
END
EDIT2:Table 在创建之前被删除。 但现在我的问题是:SSMS 识别错误即。提供的列数和值数不匹配,但为什么看不到 table 被删除?
答案是"no"。如果你真的必须这样做,那么我建议使用动态SQL,并执行它。
这听起来绝对是糟糕的设计。
ALTER proc [dbo].[sp_temp]
AS
BEGIN
CREATE TABLE TX (ID INT)
DECLARE @I INT =0
WHILE (@I<=10)
BEGIN
INSERT INTO TX(ID) VALUES (@I)
SET @I += 1
END
ALTER TABLE TX ADD COL1 VARCHAR(10)
INSERT INTO TX VALUES (11, 'SOME TEXT');
END