Sql 存储过程拒绝删除它创建的列
我创建了一个存储过程,用于刷新表中的数据。它首先重新加载整个表。接下来,应用几个过滤器。(例如:列“Model”必须等于“W”;所有具有模型“B”的行都将被删除。)这是在加载表之后发生的(而不是在加载期间),因为我想记录由于每个筛选器而删除的行数。应用过滤器后,某些列的每一行都包含相同的值(其他值在过滤过程中被删除)。这些列现在没用了,所以我想删除它们 对于SQL Server来说,这似乎是有问题的。当给出执行SP的命令时,它表示在最后一步中应该删除的列当前不存在,并且拒绝运行。这在技术上是正确的,列当前不存在,但它们将由SP自己创建 一些模型代码:Sql 存储过程拒绝删除它创建的列,sql,sql-server,stored-procedures,sql-server-2016,Sql,Sql Server,Stored Procedures,Sql Server 2016,我创建了一个存储过程,用于刷新表中的数据。它首先重新加载整个表。接下来,应用几个过滤器。(例如:列“Model”必须等于“W”;所有具有模型“B”的行都将被删除。)这是在加载表之后发生的(而不是在加载期间),因为我想记录由于每个筛选器而删除的行数。应用过滤器后,某些列的每一行都包含相同的值(其他值在过滤过程中被删除)。这些列现在没用了,所以我想删除它们 对于SQL Server来说,这似乎是有问题的。当给出执行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
)
如何绕过此问题并使SP运行?如果我理解正确,您可以使用动态SQL:
exec sp_executesql 'ALTER TABLE dbo.Table DROP COLUMN Model';
是否可以再次检查视图中是否存在列“Model” 因为我尝试过同样的场景,它对我来说很有效
在SQL Server中从表中删除任何列的语法是
ALTER TABLE TableName DROP COLUMN ColumnName ;
这可能是问题的原因。视图中存在“模型”列。如果再次运行脚本,它是否仍然有效?第一次运行脚本时应该没有问题,因为您可能还没有从表中删除列。@A.Stam:每次删除并重新创建表的时候都是正确的??没有提到视图与表之间存在依赖关系。因此不会有任何问题。错误的原因是编译过程时,
dbo.Table
存在,但没有Model'列。根据没有列的架构验证
ALTER TABLE`语句,但该语句失败。在动态SQL中包装alter语句可以避免此问题,因为该语句将在执行前立即单独编译。@A.Stam:使用正确的语法“alter TABLE dbo.TABLE DELETE COLUMN Model”修改脚本以更改TABLE dbo.TABLE DROP COLUMN Model这是问题中的一个输入错误,感谢您的注意。我的语法在过程中是正确的。编译时没有错误。我现在正在测试程序以检查结果。程序现在运行正常。但是,我必须按如下方式格式化查询:DECLARE@sqlnvarchar(100)='altertable dbo.TABLE DROP COLUMN Model';EXEC sp_executesql@sql
。出于某种原因,sp_executesql不会像您的示例中那样简单地接受字符串作为参数。
ALTER TABLE TableName DROP COLUMN ColumnName ;