2016-05-18 129 views
0

你好我正試圖在數據庫中加載數據庫時禁用所有外鍵約束。由於它是每月工作的一部分,我想動態地完成它,因此它可以處理任何更改。我試圖做到這一點,而不使用遊標或臨時表。我已經建立了下面的語句,但到目前爲止,而我希望它執行ALTER語句在SQL服務器中動態構建和執行語句

declare @SQLStatement as nvarchar(4000) 
SET @SQLStatement = 'exec (''select ''''alter table prpcref_mjp''''  + ''''.'''' + b.name + ''''.'''' + parent_tbl.name + '''' NOCHECK CONSTRAINT '''' + fk.name 
from prpcref_mjp.sys.foreign_keys fk 
inner join prpcref_mjp.sys.all_objects parent_tbl 
    on fk.parent_object_id = parent_tbl.object_id 
inner join prpcref_mjp.sys.schemas b 
    on fk.schema_id = b.schema_id'')' 
EXECUTE sp_executesql @SQLStatement 
+0

您是否擔心所有數據加載後如何重新創建外鍵約束? – user212514

回答

1

離開EXEC出字符串這將創建一個ALTER語句:

select exec('alter table prpcref_mjp''' + 
'';'.'''' + 
     b.name + ''''.'''' + parent_tbl.name + 
      '''' NOCHECK CONSTRAINT '''' + fk.name 
       from prpcref_mjp.sys.foreign_keys fk 
       inner join prpcref_mjp.sys.all_objects parent_tbl 
        on fk.parent_object_id = parent_tbl.object_id 
       inner join prpcref_mjp.sys.schemas b 
        on fk.schema_id = b.schema_id') 
+0

這只是運行select語句 – MattP

+0

@MattP答案更新後,SQL中可能會出現一些錯誤(因爲我現在沒有SQL),但希望你明白了。 –

+0

這是我所能得到的。我似乎無法在'exec'語句的末尾添加括號: \t'聲明@SQLStatement as nvarchar(4000) \t SET @SQLStatement ='select''exec(''''alter table prpcref_mjp' '+'。''+ b.name +''。''+ parent_tbl.name +''NOCHECK CONSTRAINT''+ fk.name \t from prpcref_mjp.sys.foreign_keys fk \t inner join prpcref_mjp.sys.all_objects parent_tbl \t上fk.parent_object_id = parent_tbl.object_id \t內加入prpcref_mjp.sys.schemas b \t上fk.schema_id = b.schema_id + '') ''」 \t EXEC(@SQLStatement)' – MattP

0

這裏的另一種方式方法創建一個包含所有DDL語句的字符串:

declare @SQLStatement nvarchar(4000) = '' 
select @SQLStatement += 'ALTER TABLE prpcref_mjp.' + b.name + '.' + parent_tbl.name + ' DROP CONSTRAINT ' + fk.name + ';' + char(13) + char(10) 
    from prpcref_mjp.sys.foreign_keys fk 
inner join prpcref_mjp.sys.all_objects parent_tbl 
    on fk.parent_object_id = parent_tbl.object_id 
inner join prpcref_mjp.sys.schemas b 
    on fk.schema_id = b.schema_id 
print @SQLStatement 
exec(@SQLStatement) 

您可以添加where條款來限制你要修改的表。如果您想在實際運行代碼之前查看代碼,請在末尾註釋掉exec()

請注意,我添加了+ char(13) + char(10)以使print語句的輸出更易於閱讀。

+0

嘿謝謝@ user212514工作的魅力。唯一的問題是,我需要在選擇中使用完全限定的對象名稱,因爲我在多個數據庫上運行它,即。 prpcref_mjp.sys.all_objects。我會提供一個反映這個問題的答案 – MattP

+0

我會很快編輯這個。 – user212514

0
select @NSQL = 'set @SQLStatement_out = '''' 
select @SQLStatement_out += ''ALTER TABLE ' + @dbname + '.'' + b.name + ''.'' + parent_tbl.name + '' NOCHECK CONSTRAINT '' + fk.name + '';'' + char(13) + char(10) 
    from ' + @dbname + '.' + 'sys.foreign_keys fk 
inner join ' + @dbname + '.' +'sys.all_objects parent_tbl 
    on fk.parent_object_id = parent_tbl.object_id 
inner join ' + @dbname + '.' + 'sys.schemas b 
    on fk.schema_id = b.schema_id 
    exec(@SQLStatement_out) ' 

SET @ParmDefinition = N'@SQLStatement_out varchar(max) OUTPUT'; 

exec sp_executesql @NSQL, @ParmDefinition, @[email protected] OUTPUT; 

exec(@SQLStatement)