これは私が使用しているクエリです:
DELETE TB1.*, TB2.*
FROM TB1
INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID
WHERE (TB1.PersonID)='2'
MS Accessでは正常に動作していますが、SQL Server Express 2005でエラー(「、」の近くの構文が正しくありません)が発生します。
それを解決する方法は?助けてください。
これは私が使用しているクエリです:
DELETE TB1.*, TB2.*
FROM TB1
INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID
WHERE (TB1.PersonID)='2'
MS Accessでは正常に動作していますが、SQL Server Express 2005でエラー(「、」の近くの構文が正しくありません)が発生します。
それを解決する方法は?助けてください。
DELETE
単一の式を含む複数のテーブルから、SQL 2005
またはその他の標準 SQL を使用することはできません。Access
ここでは例外です。
この効果を得る最良の方法はFOREIGN KEYS
、テーブルの間にON
DELETE
trigger
.
なぜあなたは使用しないのDELETE CASCADE FK
ですか?
これは、1 つのステートメントでは実行できません。2つのステートメントを使用する必要があります
DELETE FROM TB1 WHERE PersonID = '2';
DELETE FROM TB2 WHERE PersonID = '2';
私が知っているように、あなたは文でそれを行うことはできません.
ただし、トランザクション内の任意のテーブルで必要な削除を行うストアド プロシージャを構築できます。これはほとんど同じです。
マスターの主キーを参照する詳細テーブルの外部キーを指定し、削除ルール = Cascade を設定します。
マスター テーブルからレコードを削除すると、行の削除の主キー値に基づいて、他のすべての詳細テーブル レコードが自動的に削除されます。
その場合、マスター テーブルの 1 回の削除クエリで、マスター テーブルのデータと子テーブルのデータを削除できます。
一度に複数のテーブルから削除できるとは思いません(確かではありませんが)。
ただし、削除をカスケードする関係でこの効果を達成するのが最善であるように思えます。これを行うと、一方のテーブルからレコードを削除でき、他方のレコードは自動的に削除されます。
例として、2 つのテーブルが顧客と顧客の注文を表しているとします。カスケード削除の関係を設定すると、顧客テーブルのレコードを削除するだけで、注文が自動的に削除されます。
参照整合性制約のカスケードに関する MSDN のドキュメントを参照してください。
次のようなものを使用できます。
DECLARE db_cursor CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE name IN ("TB2","TB1") -- use these databases
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM @name WHERE PersonID ='2'
FETCH NEXT FROM db_cursor INTO @name
END
CREATE PROCEDURE sp_deleteUserDetails
@Email varchar(255)
AS
declare @tempRegId as int
Delete UserRegistration where Email=@Email
set @tempRegId = (select Id from UserRegistration where Email = @Email)
Delete UserProfile where RegID=@tempRegId
RETURN 0
Try this query
DELETE TB1, TB2 FROM TB1 INNER JOIN TB2
WHERE TB1.PersonID = TB2.PersonID and TB1.PersonID = '2'