Как правильно выбрать SELECT INTO @TempTable несколько раз, чтобы вернуть один набор результатов? - PullRequest
6 голосов
/ 22 августа 2011

Я пытаюсь написать хранимую процедуру для Crystal Reports, объединив несколько запросов в один набор результатов (Crystal не поддерживает несколько результатов в одном отчете).

Набор результатов, который я пытаюсь получить, объединяет столбцы из обеих таблиц.

В SP я объявляю @temptable и столбцы (потому что две запрашиваемые таблицы имеют разные столбцы).

DECLARE @TEMPNEWBILLING TABLE
(
    ACCOUNT DECIMAL null,
    CLIENT NVARCHAR null,
    TIMESTAMP INT null,
    BILLING DECIMAL null, 
    CALLKIND INT null,
    HITK1 DECIMAL null,
    HITK2 DECIMAL null, 
    HIDISC DECIMAL null, 
    HITALK DECIMAL null, 
    HIPTCH DECIMAL null,
    HICONF DECIMAL null,
    HIHOLD DECIMAL null,
    PTCH DECIMAL null,
    SUPERTIME DECIMAL null
)

Я тогда SELECT из обеих таблиц INTO временная таблица:

SELECT Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,     HiConf, HiHold, Ptch
 INTO TEMPNEWBILLING 
 FROM   
        mCallEnd
 WHERE  billing = cast(@BILLINGNUMBER as decimal)
    AND Timestamp > @STARTITIME
    AND Timestamp < @ENDITIME
    AND CallKind  in (0,1,2,3,4,16)

SELECT 
     Billing, SuperTime
 INTO TEMPNEWBILLING 
FROM
        mClientMaint
 WHERE  billing = cast(@BILLINGNUMBER as decimal)
    AND Timestamp > @STARTITIME
    AND Timestamp < @ENDITIME

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

SELECT * FROM @TEMPNEWBILLING

К сожалению, что-то идет не так, как при запуске SP, я получаю ошибку,

В базе данных уже есть объект с именем 'TEMPNEWBILLING'.

Я проверил это, и кажется, что первый запрос выполняется, но ошибка появляется во втором Select Into. Я должен делать это неправильно, так как я получаю ту же ошибку, если я использую # таблицы или @ таблицы (то есть delcare таблица против создания таблицы).

Не является ли перспектива заполнения временной таблицы результатами двух запросов просто невозможной? Я использую не тот инструмент для работы?

Ответы [ 3 ]

11 голосов
/ 22 августа 2011

В вашем коде вы не используете таблицу переменных, которую вы определили, а пытаетесь поместить результаты в одну и ту же физическую таблицу.Попробуйте вместо этого:

INSERT INTO @TEMPNEWBILLING(Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,     HiConf, HiHold, Ptch)
SELECT Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,     HiConf, HiHold, Ptch
 FROM   
        mCallEnd
 WHERE  billing = cast(@BILLINGNUMBER as decimal)
    AND Timestamp > @STARTITIME
    AND Timestamp < @ENDITIME
    AND CallKind  in (0,1,2,3,4,16)

INSERT INTO @TEMPNEWBILLING(Billing, SuperTime)
SELECT 
     Billing, SuperTime
FROM
        mClientMaint
 WHERE  billing = cast(@BILLINGNUMBER as decimal)
    AND Timestamp > @STARTITIME
    AND Timestamp < @ENDITIME
10 голосов
/ 22 августа 2011

SELECT ... INTO создает новую таблицу.

Вы хотите отменить ее:

INSERT INTO @TEMPNEWBILLING 
(Columns...)
SELECT (your select query here)

Вам нужно объявить таблицу (технически это переменная таблицытак как вы используете знак @), как вы и сделали.Затем используйте INSERT INTO ... SELECT ... для всех ваших вставок.

4 голосов
/ 22 августа 2011

Вам нужно использовать INSERT после того, как таблица уже создана. Кроме того, вы используете переменную таблицы, поэтому при обращении к ней необходимо указывать символ @ в начале имени. Поскольку вы объявляете переменную таблицы в начале, на самом деле оба оператора должны быть INSERT, а не SELECT INTO.

SELECT INTO пытается создать новую таблицу. В своем коде вы в основном объявляете переменную таблицы (которая никогда не используется), затем ваш первый SELECT INTO создает постоянную таблицу с именем TEMPNEWBILLING, затем ваш второй SELECT INTO пытается создать таблицу с таким же точным именем - отсюда и ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...