首先忘掉这个问题,
我想我应该通过在我存储的prod中提供一些我的查询示例来更清楚地了解我的问题
假设我有一个目标表TBLA
和一个源表TBLB
。
步骤1:我从我的数据库表中获取sql,例如
--I Ran this process in a cursor that @Sql is actually a pass in selected coloum value
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'SELECT TBLB.coloumA, TBLB.coloumB... into ##TempTable
FROM TBLB
WHERE CONVERT(VARCHAR(10),Date,120)='2011-04-05'';
EXEC sp_ExecuteSql @sql
步骤2:通过调用另一个sp_ExecuteSql
来删除目标表数据DECLARE @CheckClear NVARCHAR(MAX);
SET @CheckClear = 'DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)';
EXEC sp_ExecuteSql @CheckClear ;
--This section is my problem describe below.
步骤3:通过select * from temp table
插入TBLADECLARE @DumpSql NVARCHAR(MAX);
SET @DumpSql = 'INSERT INTO TBLA
SELECT * FROM ##TempTable';
EXEC sp_ExecuteSql @DumpSql ;
第2步中的问题更详细:
基本上,在我执行删除声明之后,我发现我的所有数据都丢失了,看起来只是执行第一行DELETE FROM TBLA
...
例如Senario
在我尝试删除语句之前,我只想选择##TempTable
值,这是正确的。哦是的,它只有2011-11-04数据
实际上我的TBLA
目前已有2011-11-03和2011-11-02数据。
PS:我实际上是按日期值选择数据。
这是我运行上面的sql,它的成功......
并且继续,我打开我的TBLA
并查看结果。我的天啊!!!!它只有2011-11-04
数据......其余的是哪里?
请注意:
以上sql只是我使用sp_executesql的dyamic存储prod的一部分..
我的实际数据是我有300个表需要处理,正确的总共300个表有不同的唯一indentity
所以我不能使Select * From ##Temptable Where id=something
希望这个问题更加清晰
谢谢你,感谢你的帮助
关于:
LiangCk
答案 0 :(得分:2)
检查一下: 使用where条件中的子查询从mytable中删除行:
DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2)
如果您要根据日期查找要删除的唯一值,请在Temporary表中创建唯一值,然后执行删除操作。
其次,如果你在某种程度上根据连接操作寻找删除操作:
然后点击此链接:
How do I delete from multiple tables using INNER JOIN in SQL server
检查这些链接以了解如何使用SP_Execute在临时表中插入行:
Sql server - how to insert single row into temporary table?
Insert multiple rows into temp table with one command in SQL2005
希望这些对你有所帮助..
答案 1 :(得分:0)
首先,您应该确定TBLA的主键字段。我认为PK是FLDA。
当您从临时表中存在的TBLA行中删除时,右侧sintax为:
DELETE FROM TBLA
WHERE FLDA IN
(SELECT ##TempTable.FLDA
FROM ##TempTable)
使用sql server解决此问题的一种更优雅的方法是MERGE语句:
MERGE
INTO TBLA AS target
USING (Select * from ##TempTable)
ON TBLA.FLDA = ##TempTable.FLDA
[ WHEN MATCHED [ AND <clause_search_condition> ]
THEN <merge_matched> ] [ ...n ]
[ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
THEN <merge_not_matched> ]
[ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
THEN <merge_matched> ] [ ...n ]
[ <output_clause> ]
[ OPTION ( <query_hint> [ ,...n ] ) ]
<强>被修改强> 我看到了你更详细的问题。
执行时:
DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)
所有数据都将被删除,因为条件总是返回True。
可以将TBLA中的所有表字段连接起来进行比较,以便连接来自## TempTable的所有表字段。