你不能只说
ALTER TABLE FOO DROP CONSTRAINT;
您必须给出一个约束名称:
ALTER TABLE FOO DROP CONSTRAINT CONS_SOME_CONS_NAME;
您似乎正在尝试使用后一个查询来返回约束名称的结果集?你不能用这样的 SELECT 来提供 ALTER 语句,它也不起作用。要么使用 SQL 生成脚本,然后保存脚本并运行它,要么使用动态 SQL。
动态 SQL 是删除对象时使用的最危险的做法之一,但我看到它在 StackOverflow 上如此随意地建议。除非您需要自动化并且需要一个能够适应潜在差异的脚本(例如向客户部署更改脚本),否则您不会使用它。否则,您应该练习安全 DBA 并将脚本生成到文本窗口,然后在执行之前对其进行验证。动态 SQL 直接从生成跳转到执行。多花 15 秒来验证。
您可以保存它并将其部署到其他数据库,因为您知道只有该脚本中的操作才会运行。部署动态 SQL 还可能为每个数据库部署不同的操作;有时这是你想要的,有时不是。
要像这样生成 DDL,请从 SSMS 菜单中选择“Results to Text”,或简称为 CTRL-T,然后运行:
SELECT 'ALTER TABLE T DROP CONSTRAINT ' + d.name
from syscolumns c, sysobjects d, sysobjects t
where c.id=t.id AND d.parent_obj=t.id AND d.type='D' AND t.type='U'
AND c.name='ENC_TOKEN_KEK_SALT_SIZE' AND t.name='EPS_ENROLLMENT';
然后你有你的脚本,复制粘贴它,验证它,保存它。此技术适用于任何具有数据字典目录的数据库。