我正在尝试编写用于删除约束的脚本。
我有以下函数来选择我的DataBase中的Constarints
SELECT name
FROM sys.foreign_keys
我已经使用上面的脚本编写了alter scripts
SELECT
'ALTER TABLE ' + OBJECT_NAME(parent_object_id) +
' DROP CONSTRAINT ' + name
FROM sys.foreign_keys
使用上面的查询我该如何执行这些约束?
我可以使用DROP DATABASE DBName
。但我只是试图通过删除约束来删除表。
可以不用SP吗?或者我可以采取哪些简单方法?
答案 0 :(得分:35)
您可以随时复制底部窗格中的输出,将其粘贴到顶部窗格中,然后按F5。或者您可以构建一个直接执行的字符串:
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
+ '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) +
' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.foreign_keys;
PRINT @sql;
-- EXEC sp_executesql @sql;
(当您对PRINT
输出感到满意时,请将其注释掉并取消注释EXEC
。请注意,在Management Studio中,打印输出将被截断为8K,但该变量确实包含整个命令。)
此外,我不知道这与您是否使用存储过程有什么关系,或者您为什么要尝试“不使用SP”...这个查询可以作为一个存储过程与否,一切都取决于你打算调用它的频率,程序所在的位置等等。
答案 1 :(得分:19)
这在SQL Server 2008中对我有用:
DECLARE @SQL NVARCHAR(MAX) = N'';
SELECT @SQL += N'
ALTER TABLE ' + OBJECT_NAME(PARENT_OBJECT_ID) + ' DROP CONSTRAINT ' + OBJECT_NAME(OBJECT_ID) + ';'
FROM SYS.OBJECTS
WHERE TYPE_DESC LIKE '%CONSTRAINT' AND OBJECT_NAME(PARENT_OBJECT_ID) = 'YOUR_TABLE';
PRINT @SQL
--EXECUTE(@SQL)
当然,在准备好运行时取消注释EXECUTE(@SQL)
答案 2 :(得分:2)
正确标记的问题对我不起作用。但这在SQL Server 2017中适用于我:
for indx, shape in enumerate(rectangles):
print indx,shape