SQL Query从表中定义的表中删除数据

时间:2017-06-30 13:11:58

标签: sql sql-server tsql microsoft-dynamics dynamics-nav-2009

我正在尝试从我的SQL库中的许多表中删除数据。

在数据库中,我有一个名为company的表,其中包含我需要从中删除数据的每个表的名称。

假设我的公司表中有3家公司。

我想要做的是删除每家公司某些特定表格中的所有记录。

所以,在公司表中我有以下3条记录:

1  2  3

数据库中还有以下表格,用于描述每家公司的扫描文件。

dbo.1.documents
dbo.2.documents
dbo.3.documents

我要做的是创建一个将通过dbo.company表运行的SQL查询,并根据在那里找到的公司名称清除文档表。

这是我的代码:

DECLARE @MyCursor CURSOR;
DECLARE @MyField varchar;
BEGIN
SET @MyCursor = CURSOR FOR
select top 1000 [Name] from dbo.Company    

OPEN @MyCursor 
FETCH NEXT FROM @MyCursor 
INTO @MyField

WHILE @@FETCH_STATUS = 0
BEGIN

  delete * from 'dbo.'+@MyField+'$documents'

  FETCH NEXT FROM @MyCursor 
  INTO @MyField 
END; 

CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;

我不确定语法应该如何,但我想它就是这样的。

有人关心如何根据dbo.company.name中的记录动态删除数据吗?

2 个答案:

答案 0 :(得分:6)

使用动态sql。

将delete-statement替换为下面的代码(声明可以在开始时完成):

DECLARE @sql NVARCHAR(1000)
SET @sql = N'delete from dbo.'+CONVERT(VARCHAR,@MyField)+'documents'
EXEC sp_executesql @sql

答案 1 :(得分:1)

您可以稍微改变动态sql并避免为此创建游标的所有麻烦和开销。我正在使用表中的值来生成许多delete语句,然后执行它们。编写代码并消除那些令人讨厌的光标的努力要少得多。

declare @SQL nvarchar(max) = ''

select @SQL = @SQL + 'delete dbo.[' + c.Name + '$documents];'
from dbo.Company

select @SQL --uncomment the line below when you are satisfied the dynamic sql is correct
--exec sp_executesql @sql