SQL Server: удалить, выбрав значение из временной таблицы - PullRequest
0 голосов
/ 01 декабря 2011

Сначала забудь о вопросе,

Я думаю, что мне следует прояснить свой вопрос, предоставив некоторый пример моего запроса в моем сохраненном продукте

Предположим, у меня есть таблица назначения 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: Вставить в TBLA, выбрав * из временной таблицы

DECLARE @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 .. Мои фактические данные: у меня есть 300 таблиц, которые должны быть обработаны и должным образом всего 300таблицы имеют разные уникальные indentity, поэтому я не могу сделать Select * From ##Temptable Where id=something

Надеюсь, что это намного яснее вопрос

Спасибо, благодарю вас за помощь

Награды:

LiangCk

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

отметьте это: Удалите строки из mytable, используя подзапрос в условии where:

DELETE FROM mytable WHERE id IN (SELECT id FROM mytable2)

Если вы ищете уникальные значения для удаления по дате, то создайте уникальные значения в вашей временной таблице и затем выполнитеоперация удаления, как вы делаете.

Во-вторых, если вы ищете операцию удаления, основанную на операции соединения: перейдите по этой ссылке:
Как удалить из нескольких таблиц, используя INNER JOIN в SQLсервер

Проверьте эти ссылки, чтобы узнать, как вставить строку во временную таблицу, используя SP_Execute:
Sql сервер - как вставить одну строку во временную таблицу?
Вставка нескольких строк во временную таблицу с помощью одной команды в SQL2005
надеюсь, что это мало вам поможет ..

0 голосов
/ 01 декабря 2011

Прежде всего, вы должны определить поля первичного ключа для TBLA. Я предполагаю, что PK FLDA.

При удалении из строк TBLA, существующих в временной таблице, правильный синтаксис:

DELETE FROM TBLA
WHERE FLDA IN 
   (SELECT ##TempTable.FLDA 
   FROM ##TempTable)

Более элегантный способ решить эту проблему с сервером sql - 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 ] ) ] 

1012 * Отредактировано * Я видел ваш более подробный вопрос.

При выполнении:

DELETE FROM TBLA WHERE EXISTS(SELECT * FROM ##TempTable)

все ваши данные будут удалены, потому что когда условие всегда возвращает True.

Обходной путь можно объединить все поля таблицы из TBLA для сравнения с объединением всех полей таблицы из ## TempTable.

...