2015-11-06 42 views
0

我有做为了涂改存储过程改变表

  1. 与单个列创建表在表
  2. 添加更多的列表
  3. 插入数据下面的程序

第一次执行SP后,该表已存在。因此,如果我在SP中进行了更改并尝试保存它,它将在插入步骤中引发错误,说 “列名或提供的值数量与表定义不匹配”。

有什么办法可以禁用这个'检查'并以某种方式更新SP而不必删除表吗?

编辑:这个SP应该每年只运行一次,生成一个报告。直到明年才有人看。实际上,有一组5-6个存储过程生成所有表(大约25个),然后用于生成报告。所以,当在SP中进行更改时,这些表将被删除,并且所有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:表被创建之前丢弃。 但现在我的问题是:SSMS识别错误即。列数不匹配和提供值的数量不匹配,但为什么看不到表格被丢弃?

+0

这是什么意思。你期待存储过程只执行一次吗?那为什么要使用存储过程? –

+0

请发布您的代码。您必须使用IF语句来防止重新创建表格 –

+0

糟糕的设计气味 –

回答

0
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 
3

答案是“否”。如果你真的必须这样做,那么我建议使用动态SQL并执行它。

这绝对听起来很糟糕的设计。