【发布时间】: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. TheALTER 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