0

我有一个场景,我必须从表中删除记录,这些记录可能存在也可能不存在于不同的数据库中。例如,该表称为 Md5SumJob。它存在于数据库 A 但不存在于数据库 B 中。所以我已经有一个检查表是否存在于数据库中。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'Md5SumJob')

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

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'Md5SumJob')
        DELETE FROM x FROM (select * from INFORMATION_SCHEMA.COLUMNS i where i.TABLE_NAME = 'Md5SumJob') x
        JOIN @pid p on p.CtpJobId = (select * from INFORMATION_SCHEMA.COLUMNS i 
        where i.COLUMN_NAME = 'CtpJobId' and i.TABLE_NAME = 'Md5SumJob')
4

2 回答 2

2

使用 sp_executesql 执行动态查询:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE table_name = 'Md5SumJob')
    EXEC sp_executesql ('DELETE From Md5SumJob');

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

于 2018-07-11T14:43:11.753 回答
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;
于 2018-07-11T14:43:55.340 回答