存储过程拒绝删除它创建的列

时间:2016-09-02 10:42:09

标签: sql sql-server stored-procedures sql-server-2016

我创建了一个存储过程来刷新表中的数据。它首先重新加载整个表。接下来,应用几个过滤器。 (例如:'Model'列必须等于'W';所有带有'B'模型的行都将被删除。)这是在加载表之后(而不是在期间)发生的,因为我想记录删除了多少行因为每个过滤器。应用过滤器后,某些列在每一行中都包含相同的值(其他值在过滤过程中被删除)。这些列现在没用了,所以我想删除它们。

这对SQL Server来说似乎有问题。当给出执行SP的命令时,它指示它应该在其最后步骤中删除的列当前不存在并拒绝运行。这在技术上是正确的,列目前不存在,但它们将由SP本身创建。

一些模型代码:

CREATE PROCEDURE dbo.Procedure AS (
  DROP TABLE dbo.Table
  SELECT * INTO dbo.Table FROM dbo.View
  INSERT INTO dbo.Log VALUES (GETDATE(),(SELECT COUNT(1) FROM dbo.Table))
  DELETE FROM dbo.Table WHERE Model <> 'W'
  INSERT INTO dbo.Log VALUES (GETDATE(),(SELECT COUNT(1) FROM dbo.Table))
  ALTER TABLE dbo.Table DROP COLUMN Model
)

执行时的错误代码:

[2016-09-02 12:25:20] [S0001][207] Invalid column name 'Model'.

如何规避此问题并让SP运行?

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以使用动态SQL:

exec sp_executesql 'ALTER TABLE dbo.Table DROP COLUMN Model';

答案 1 :(得分:1)

SQL Server 中的表中删除任何列的语法是

ALTER TABLE TableName DROP COLUMN ColumnName ;  

这可能是问题的原因。

答案 2 :(得分:0)

您是否可以再次检查专栏的存在情况&#39;型号&#39;存在于视图中。

因为我尝试了同样的场景,它的作用对我来说..

enter image description here