【问题标题】:Stored Procedure refuses to delete column that it creates存储过程拒绝删除它创建的列
【发布时间】:2016-09-02 10:42:08
【问题描述】:

我创建了一个刷新表中数据的存储过程。它首先重新加载整个表。接下来,应用了几个过滤器。 (例如:“模型”列必须等于“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 运行?

【问题讨论】:

  • 错误的原因是因为dbo.Table存在,但没有Model' column, when the proc is compiled. The ALTER TABLE`语句针对没有列的模式进行验证并失败。将 alter 语句包装在动态 SQL 中将避免该问题,因为该语句将在执行之前立即单独编译。
  • @A. Stam :使用正确的语法 'ALTER TABLE dbo.Table DELETE COLUMN Model' 修改你的脚本到 ALTER TABLE dbo.Table DROP 列模型

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


【解决方案1】:

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

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

【讨论】:

  • 这样编译没有错误。我现在正在测试程序以检查结果。
  • 程序现在运行良好。但是,我必须将查询格式化如下:DECLARE @sql nvarchar(100) = 'ALTER TABLE dbo.Table DROP COLUMN Model' ; EXEC sp_executesql @sql。出于某种原因, sp_executesql 不会像您的示例中那样简单地接受字符串作为参数。
【解决方案2】:

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

ALTER TABLE TableName DROP COLUMN ColumnName ;  

这可能是问题的原因。

【讨论】:

  • 这是问题中的错字,感谢您的注意。我的语法在程序中是正确的。
【解决方案3】:

您能否再检查一下视图中是否存在“模型”列。

因为我已经尝试过相同的场景并且它对我有用..

【讨论】:

  • 视图中存在“模型”列。如果再次运行脚本,它仍然有效吗?第一次运行脚本应该没问题,因为您可能还没有从表中删除列。
  • @ A. Stam :每次删除并重新创建表时,对吗?没有提到 VIEW 与表有依赖关系。所以不会有任何问题..
猜你喜欢
  • 2023-03-16
  • 2022-11-14
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2017-08-05
  • 2013-06-05
相关资源
最近更新 更多