Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 运行DELETE语句删除存储在表中的某些表名_Sql_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql 运行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语句(从它们所表示的表中删除所有行,而不是从表名中删除它们)。我以为我能做到

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