2

テーブルから制約を削除するストアド プロシージャを作成しようとしています。

また、テーブルが存在するかどうかを確認するには、テーブルが存在し、パラメーターが null または空でないかどうかを確認する場合に、ネストするよりもエレガントな方法がありますか?

これは SQL Server 2008 R2 用です。

ALTER PROCEDURE [dbo].[sp_quitarConstrain](@table NVARCHAR(50))
AS
DECLARE @database NVARCHAR(50)
DECLARE @sql NVARCHAR(255)
SET @database = 'table'

IF((COALESCE(@table,'') <> '') OR (@table IS NULL))
    BEGIN
        PRINT 'Necesitas dar una tabla valida'
        RETURN 
    END
ELSE
    BEGIN
        WHILE EXISTS(SELECT * FROM sys.foreign_keys WHERE referenced_object_id = object_id(+ @table))
        BEGIN
            SELECT    @sql = 'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + ' DROP CONSTRAINT ' + name 
            FROM    sys.foreign_keys 
            WHERE    referenced_object_id = object_id(@table)

            EXEC    sp_executesql @sql
        END
    END
4

1 に答える 1

2

Stored Proc は動作しますが、わずかな変更のみで動作します。たとえば、次の(COALESCE(@table,'') <> '') ようにする必要があります。(COALESCE(@table,'') = '')

ALTER PROCEDURE [dbo].[sp_quitarConstrain](@table NVARCHAR(50))
AS
    DECLARE @sql NVARCHAR(255)

    IF((COALESCE(@table,'') = '') OR (@table IS NULL))
        BEGIN
            PRINT 'Necesitas dar una tabla valida'
            RETURN 
        END
    ELSE
        BEGIN
            WHILE EXISTS(SELECT * FROM sys.foreign_keys WHERE referenced_object_id = object_id(@table))
                BEGIN
                    SELECT    @sql = 'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + ' DROP CONSTRAINT ' + name 
                    FROM    sys.foreign_keys 
                    WHERE    referenced_object_id = object_id(@table)
                    EXEC    sp_executesql @sql
                END
        END

スキーマについてあまりうるさくない場合は、次のようにテーブルを確認できます。

IF NOT EXISTS(SELECT 1 FROM sys.tables WHERE name=@table)
    BEGIN
        PRINT 'Necesitas dar una tabla valida'
        RETURN 
    END
于 2012-08-29T15:05:39.410 に答える