2011-08-22 26 views
5

Tôi đang cố gắng viết một thủ tục lưu sẵn cho Crystal Reports bằng cách kết hợp nhiều truy vấn vào một kết quả đơn (Crystal không hỗ trợ nhiều kết quả trong một báo cáo).Làm thế nào để CHỌN đúng INTO @TempTable Nhiều lần để trả về một kết quả đơn?

Tập kết quả tôi đang cố gắng kết hợp các cột từ cả hai bảng.

Trong SP, tôi khai báo @temptable và các cột (vì hai bảng tôi đang truy vấn có các cột khác nhau).

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 
) 

sau đó tôi SELECT từ hai bảng INTO bảng tạm thời:

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 

Và cuối cùng, tôi chỉ nhận được tất cả dữ liệu từ bảng temp.

SELECT * FROM @TEMPNEWBILLING 

Thật không may, một cái gì đó đang xảy ra sai, như khi tôi chạy SP, tôi nhận được một lỗi mà

Hiện đã là một đối tượng có tên là 'TEMPNEWBILLING' trong cơ sở dữ liệu.

Tôi đã kiểm tra và có vẻ như truy vấn đầu tiên đang chạy, nhưng lỗi được đưa vào lựa chọn thứ hai. Tôi phải làm điều này sai, vì tôi nhận được cùng một lỗi nếu tôi sử dụng # bảng hoặc @ bảng (ví dụ: delcare bảng so với tạo bảng).

Có phải khách hàng tiềm năng điền bảng tạm thời với kết quả của hai truy vấn đơn giản là không thể? Tôi có sử dụng công cụ sai cho công việc không?

Trả lời

11

Trong mã của bạn, bạn không sử dụng bảng biến mà bạn đã xác định, thay vào đó bạn đang cố gắng đưa kết quả vào cùng một bảng vật lý. Hãy thử thay thế này:

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 
4

Bạn cần sử dụng INSERT khi bảng đã được tạo. Ngoài ra, bạn đang sử dụng một biến bảng, vì vậy bạn cần phải bao gồm @ ở đầu tên khi đề cập đến nó. Vì bạn đang khai báo biến bảng lúc bắt đầu, cả hai câu lệnh phải thực sự là INSERT và không phải là SELECT INTO.

SELECT INTO cố tạo bảng mới. Trong mã của bạn, về cơ bản bạn khai báo một biến bảng (không bao giờ được sử dụng), thì đầu tiên của bạn tạo một bảng vĩnh viễn với tên TEMPNEWBILLING, sau đó lần thứ hai SELECT INTO cố gắng tạo một bảng có cùng tên chính xác - do đó có lỗi.

9

CHỌN ... INTO tạo bảng mới.

Bạn sẽ muốn đảo ngược nó:

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

Bạn sẽ muốn khai báo bảng (về mặt kỹ thuật đó là một biến bảng kể từ khi bạn đang sử dụng dấu @) như bạn đã làm. Sau đó sử dụng INSERT INTO ... SELECT ... cho tất cả các chèn của bạn.

Các vấn đề liên quan