如何正确选择INTO @TempTable多次返回单个结果集?

nag*_*eeb 6 sql t-sql sql-server-2005

我正在尝试通过将多个查询组合到单个结果集中来为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
)
Run Code Online (Sandbox Code Playgroud)

然后我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
Run Code Online (Sandbox Code Playgroud)

最后,我只是从临时表中获取所有数据.

SELECT * FROM @TEMPNEWBILLING
Run Code Online (Sandbox Code Playgroud)

不幸的是,出现问题,因为当我运行SP时,我得到一个错误

数据库中已经有一个名为"TEMPNEWBILLING"的对象.

我已经检查过它,似乎第一个查询正在运行,但错误会在第二个Select Into中抛出.我必须做错了,因为如果我使用#tables或@ tables(即delcare表和创建表),我会得到同样的错误.

用两个查询的结果填充临时表的前景是不可能的?我使用错误的工具来完成工作吗?

Lam*_*mak 11

在您的代码中,您没有使用您定义的变量表,而是尝试将结果放入同一物理表中.试试这个:

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
Run Code Online (Sandbox Code Playgroud)


Joe*_*ham 10

SELECT ... INTO创建一个新表.

你想要扭转它:

INSERT INTO @TEMPNEWBILLING 
(Columns...)
SELECT (your select query here)
Run Code Online (Sandbox Code Playgroud)

您将要声明该表(从技术上讲,它是一个表变量,因为您正在使用@符号).然后对所有插入使用INSERT INTO ... SELECT ....