从表中删除数据,该数据可能不存在

时间:2018-07-11 14:37:50

标签: sql sql-server sql-delete

我有一种情况,我必须从表中删除记录,该记录可能存在于另一个数据库中,也可能不存在。例如,该表称为Md5SumJob。它存在于数据库A中,但不存在于数据库B中。因此,我已经准备好检查表是否存在于数据库中。

def changed_selection(self):
    indexes =  self.ui_explorer_selection.selectedIndexes()
    for index in indexes:
        ix_source = self.explorer_model.mapToSource(index)
        item = self.explorer_model.sourceModel().getItem(ix_source)
        print(item.name, item.tags)

但是现在我需要弄清楚如何删除表中的实际数据。可能存在或不存在的表只有1列(nvarchar)。因此,在这里我无法弄清楚如何删除基于该1列的记录以及该表是否存在。到目前为止,这是我尝试过的方法,但是不起作用:

    for form in formset.cleaned_data:
        if 'image' in form:
            image = form['image']
            photo = DetailImage(detail=detail_form, image=image)
            photo.save()

2 个答案:

答案 0 :(得分:2)

使用sp_executesql执行动态查询:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<div id="app">
  <icon></icon>
  <global-component></global-component>
</div>

参考: https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017

答案 1 :(得分:0)

使用动态SQL很诱人:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'Md5SumJob')
BEGIN
    exec sp_executesql 'delete from Md5SumJob where CtpJobId in (select CtpJobId from @pid)'
END;

一个警告是表变量不在exec中作用域。因此,将其替换为临时表并使用:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'Md5SumJob')
BEGIN
    exec sp_executesql 'delete from Md5SumJob where CtpJobId in (select CtpJobId from #pid)'
END;