Для этого не следует использовать представления информационной схемы. Тем более, что вы заботитесь о схеме. Документация MS даже утверждает, что не использовать это. https://docs.microsoft.com/en-us/sql/relational-databases/system-information-schema-views/table-constraints-transact-sql?view=sql-server-ver15
Если вы вместо этого используете системные представления, это становится намного проще. Например, sys.tables имеет столбец «is_filetable». https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-tables-transact-sql?view=sql-server-ver15 Также обратите внимание, что я использую здесь QUOTENAME вместо добавления квадратных скобок вручную.
Затем вы можете запросить sys.foreign_keys, чтобы найти все ваши внешние ключи, так как это единственный тип ограничения, который вас касаетсяс участием.
Вся ваша циклическая конструкция может быть упрощена до чего-то подобного.
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ' DROP CONSTRAINT ' + QUOTENAME(fk.name) + ';'
from sys.foreign_keys fk
join sys.tables t on t.object_id = fk.parent_object_id
join sys.schemas s on s.schema_id = t.schema_id
where t.is_filetable = 0
select @SQL
--uncomment the line below to execute your dynamic sql
--exec sp_executesql @SQL
Это приводит нас к sp_msforeachtable. Это редко хорошая идея использовать недокументированные процедуры, подобные этой. Я также был бы немного обеспокоен тем, что вы отключаете все ограничения на каждом столе, а не только те, которые вы удалили. Возможно, вместо этого вам следует захватить все таблицы, из которых вы собираетесь отбросить внешние ключи (перед тем, как отбрасывать их), а затем отключить все ограничения ТОЛЬКО для этих таблиц.