1

这对您来说可能听起来很简单,但在您写作时并不是第一次

我有一个查询使用以下查询删除表中的所有约束

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;

EXEC sp_executesql @sql;

因此,如果这是成功的(删除了所有约束),我需要删除所有表。

否则,无论抛出约束查询,都显示有效的错误消息。

如何在上述情况下添加条件?

4

1 回答 1

2

您可能想要添加TRY....CATCH,还需要初始化变量@sql。你也可以考虑提出你的错误。


declare @sql nvarchar(max)
set @sql = ''
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;
BEGIN TRY
EXEC sp_executesql @sql;
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage         NVARCHAR(4000)
DECLARE @ErrorState INT
DECLARE @ErrorSeverity INT --Obtain the error message, severity and state
SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()
--RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
如果要在删除外键约束后立即删除表。


declare @sql nvarchar(max)
declare @sqlToDropTables nvarchar(max)
set @sqlToDropTables=''
set @sql = ''

SELECT @sqlToDropTables +=N' DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
                                          + '.'
                                          + QUOTENAME(OBJECT_NAME(parent_object_id)) 
                                          + ';'
FROM sys.foreign_keys;

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;

BEGIN TRY
EXEC sp_executesql @sql;
EXEC sp_executesql @sqlToDropTables
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage         NVARCHAR(4000)          
    DECLARE @ErrorState           INT          
    DECLARE @ErrorSeverity        INT 
    --Obtain the error message, severity and state      
    SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()      
    --RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)         
END CATCH

添加更多代码,如果要清理所有表,请包含引用对象,即 PK 表。


declare @sql nvarchar(max)
declare @sqlToDropTables nvarchar(max)
set @sqlToDropTables=''
set @sql = ''

SELECT @sqlToDropTables +=N' DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
                                          + '.'
                                          + QUOTENAME(OBJECT_NAME(parent_object_id)) 
                                          + ';'
                                          + 'DROP TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(referenced_object_id))
                                                          + '.'
                                                          + QUOTENAME(OBJECT_NAME(referenced_object_id)) 
                                                          + ';'

FROM sys.foreign_keys;

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;

BEGIN TRY
EXEC sp_executesql @sql;
EXEC sp_executesql @sqlToDropTables
END TRY
BEGIN CATCH
    DECLARE @ErrorMessage         NVARCHAR(4000)          
    DECLARE @ErrorState           INT          
    DECLARE @ErrorSeverity        INT 
    --Obtain the error message, severity and state      
    SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()      
    --RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)         
END CATCH
于 2013-04-08T07:11:08.620 回答