Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 存储过程拒绝删除它创建的列_Sql_Sql Server_Stored Procedures_Sql Server 2016 - Fatal编程技术网

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

Sql 存储过程拒绝删除它创建的列,sql,sql-server,stored-procedures,sql-server-2016,Sql,Sql Server,Stored Procedures,Sql Server 2016,我创建了一个存储过程,用于刷新表中的数据。它首先重新加载整个表。接下来,应用几个过滤器。(例如:列“Model”必须等于“W”;所有具有模型“B”的行都将被删除。)这是在加载表之后发生的(而不是在加载期间),因为我想记录由于每个筛选器而删除的行数。应用过滤器后,某些列的每一行都包含相同的值(其他值在过滤过程中被删除)。这些列现在没用了,所以我想删除它们 对于SQL Server来说,这似乎是有问题的。当给出执行SP的命令时,它表示在最后一步中应该删除的列当前不存在,并且拒绝运行。这在技术上是正确

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

如何绕过此问题并使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 ;