2017-06-30 3 views
1

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.'[email protected]+'$documents' 

    FETCH NEXT FROM @MyCursor 
    INTO @MyField 
END; 

CLOSE @MyCursor ; 
DEALLOCATE @MyCursor; 
END; 

私は構文が行くべきかどうかはわかりませんが、私はそれがこのようなものであると想像します。

誰かがdbo.company.nameのレコードに基づいてデータをどのように動的に削除することができますか?

+0

このタスクにはPHPを使用できますか? –

+0

いいえ、それは単にSQLクエリである必要があります恐れて – AronChan

+1

このNAVですか?使用しているダイナミクス製品にタグを付けると、さらに役立つことがあります。 –

答えて

6

動的SQLを使用します。

以下のコード(宣言は、開始時に行うことができます)で、削除文を交換してください:あなたは少し違った動的SQLを活用してのカーソルを作成するすべての手間とオーバーヘッドを回避することができ

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

これは私の問題を完全に解決しました。私はあなたの変換でvarchar変数に長さを追加する必要があったが、それは別に完璧だった。 – AronChan

+1

削除時のパフォーマンスが多少不足しているので、切り捨てテーブルを使用するように変更しました(これらのテーブルには多くのデータがあります)。ありがとう - 完全に動いた – AronChan

1

この。あなたのテーブル内の値を使っていくつかの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 
+1

満足のいく動的クエリを 'sp_executesql'に渡す方が生産性が向上します。 '@ SQL'は最後の行にしませんでした。 – HABO

関連する問題