Sql 运行DELETE语句删除存储在表中的某些表名
我有一个表,它存储某些表的名称-表名。我想对其中一些表运行DELETE语句(从它们所表示的表中删除所有行,而不是从表名中删除它们)。我以为我能做到Sql 运行DELETE语句删除存储在表中的某些表名,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,我有一个表,它存储某些表的名称-表名。我想对其中一些表运行DELETE语句(从它们所表示的表中删除所有行,而不是从表名中删除它们)。我以为我能做到 DELETE FROM (SELECT tableName FROM tablesNames WHERE ...) AS deleteTables 但我一直得到一个不正确的语法错误。我还考虑过在WHILE循环中迭代一个表并使用变量存储,但我希望有更简单的方法。具体来说,这是针对Microsoft SQL的,delete语句一次只能使用一个表名 完整
DELETE FROM (SELECT tableName FROM tablesNames WHERE ...) AS deleteTables
但我一直得到一个不正确的语法错误。我还考虑过在WHILE循环中迭代一个表并使用变量存储,但我希望有更简单的方法。具体来说,这是针对Microsoft SQL的,delete语句一次只能使用一个表名
完整的语法是,但它是TL;博士简而言之,您必须使用循环。delete语句一次只能使用一个表名
完整的语法是,但它是TL;博士简而言之,您必须使用循环。您不能这样做,因为内部的
SELECT
只是您要从中删除的另一个集合
基本上,您正在创建一个表名表,并告诉DB将其删除。如果没有动态sql和EXEC
您是否需要将此过程自动化
我过去做的就是这样
SELECT
'DELETE ' + tableName
FROM
tablenames
WHERE
[conditions]
您的输出将如下所示:
DELETE myTableName1
DELETE myTableName2
DELETE myTableName3
然后简单地将这个查询的结果复制到窗口外并运行它们
如果您需要在SQL中自动执行此操作,您可以将结果中的所有输出字符串连接起来,并将它们作为参数发送到
EXEC
调用。您不能这样做,因为内部的SELECT
只是您要从中删除的另一个集合
基本上,您正在创建一个表名表,并告诉DB将其删除。如果没有动态sql和EXEC
您是否需要将此过程自动化
我过去所做的就是这样
SELECT
'DELETE ' + tableName
FROM
tablenames
WHERE
[conditions]
您的输出将如下所示:
DELETE myTableName1
DELETE myTableName2
DELETE myTableName3
然后简单地将这个查询的结果复制到窗口外并运行它们
如果您需要在SQL中自动执行此操作,您可以将结果中的所有输出字符串连接起来,并将它们作为参数发送到
EXEC
调用。在这方面,您可以将SQL看作是一种类似C/C++的编译语言。SQL语句由“编译器”计算,并进行某些检查。其中一个检查是查询中直接引用的表和列是否存在(以及权限)。在生成查询时,代码中必须有确切的表名,以便编译器能够对其进行验证
好消息是SQL也是一种动态语言。这意味着您可以编写一个过程,将查询构建为字符串,并告诉数据库使用命令执行该字符串。此时,所有相同的“编译器”规则都适用,但由于您能够将表名直接插入到SQL字符串中,因此查询将通过
问题是,这也有安全隐患。最好也对照
information\u schema.Tables
这样的资源检查表,以避免潜在的注入攻击。不幸的是,如果您要删除整个表,您的整个模型可能已经受到怀疑,因此您无法保证有人不会注入您真正想要保留的表名。但是,根据它们的填充方式,您可能也很好。在这方面,您可以将SQL看作是一种类似C/C++的编译语言。SQL语句由“编译器”计算,并进行某些检查。其中一个检查是查询中直接引用的表和列是否存在(以及权限)。在生成查询时,代码中必须有确切的表名,以便编译器能够对其进行验证
好消息是SQL也是一种动态语言。这意味着您可以编写一个过程,将查询构建为字符串,并告诉数据库使用命令执行该字符串。此时,所有相同的“编译器”规则都适用,但由于您能够将表名直接插入到SQL字符串中,因此查询将通过
问题是,这也有安全隐患。最好也对照
information\u schema.Tables
这样的资源检查表,以避免潜在的注入攻击。不幸的是,如果您要删除整个表,您的整个模型可能已经受到怀疑,因此您无法保证有人不会注入您真正想要保留的表名。但是,根据它们的填充方式,您可能也很好。假设不存在潜在的约束错误,一个有趣的可能性是一个未记录的过程spmsforeachtable
,它将允许您对查询返回名称的所有表应用给定的操作:
EXEC sp_MSforeachtable @command1 = 'delete from ?'
, @whereand = 'and o.name IN (SELECT tableName FROM tablesNames WHERE ...)'
另请参阅。假设不存在潜在的约束错误,一个有趣的可能性是一个未记录的过程
spmsforeachtable
,它允许您对查询返回名称的所有表应用给定的操作:
EXEC sp_MSforeachtable @command1 = 'delete from ?'
, @whereand = 'and o.name IN (SELECT tableName FROM tablesNames WHERE ...)'
也可用于更多阅读。尝试使用光标:
DECLARE @tableName varchar(255)
DECLARE cur cursor for select tableName from tableNames where (...)
OPEN CUR
FETCH NEXT FROM cur into @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
exec('DELETE ' + @tableName)
FETCH NEXT FROM cur into @tableName
END
CLOSE cur
DEALLOCATE cur
尝试使用光标:
DECLARE @tableName varchar(255)
DECLARE cur cursor for select tableName from tableNames where (...)
OPEN CUR
FETCH NEXT FROM cur into @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
exec('DELETE ' + @tableName)
FETCH NEXT FROM cur into @tableName
END
CLOSE cur
DEALLOCATE cur
我使用了一个类似于@Pavel的游标和我的索引列表来重新组织它们。像这样的操作是使用游标的极少数好理由之一。我正在使用与@Pavel类似的游标和我的索引列表来重新组织它们。这样的操作是使用游标的极少数好理由之一。您在这里谈论的是哪个版本的SQL Server?@hd1 Microsoft SQL Server Management Studio 10.50.4000.0(2008 R2)您的表上有外键约束吗?这个链接有一些逻辑,你可以修改它来做你想做的事情。。。还有一个类似的问题:这看起来是特定于sql Server的,您在这里谈论的是哪个版本的sql Server?@hd1 Microso