আমি গ্রহণযোগ্য উত্তর দিয়ে শুরু করেছি এবং গতিশীল স্কয়ারে সম্পূর্ণ এসকিএল স্টেটমেন্ট তৈরির পরিবর্তে কিছুক্ষণ লুপ ব্যবহার করার জন্য কাঠামোটি সংশোধন করেছি। আমি বেশ কয়েকটি কারণে এটি আরও ভাল পছন্দ করি।
ক্যোরিটি বৃহত্তর @ এসকিউএল ভেরিয়েবলে সংরক্ষণ করা হয়নি। এই প্রয়োগটি আউটপুটে লগিংয়ের উদ্দেশ্যে বাদ দেওয়া প্রতিটি প্রতিবন্ধকতার জন্য একটি মুদ্রণের অনুমতি দেয়। আমার ইউনিট পরীক্ষায় মৃত্যুদন্ড কার্যকর করা কিছুটা দ্রুত বলে মনে হয়েছিল।
Set NoCount ON
Declare @schemaName varchar(200)
set @schemaName=''
Declare @constraintName varchar(200)
set @constraintName=''
Declare @tableName varchar(200)
set @tableName=''
While exists
(
SELECT c.name
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
and c.name > @constraintName
)
Begin
-- First get the Constraint
SELECT
@constraintName=min(c.name)
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
and t.[name] NOT IN ('__RefactorLog', 'sysdiagrams')
and c.name > @constraintName
-- Then select the Table and Schema associated to the current constraint
SELECT
@tableName = t.name,
@schemaName = s.name
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE c.name = @constraintName
-- Then Print to the output and drop the constraint
Print 'Dropping constraint ' + @constraintName + '...'
Exec('ALTER TABLE [' + @schemaName + N'].[' + @tableName + N'] DROP CONSTRAINT [' + @constraintName + ']')
End
Set NoCount OFF