2010-11-11 24 views
6

Tôi đang cố gắng điền bảng tạm thời dựa trên kết quả của điều kiện trong SQL 2005. Bảng tạm thời sẽ có cùng cấu trúc theo cách, nhưng sẽ được điền bằng cách sử dụng một truy vấn khác tùy thuộc vào điều kiện. Ví dụ kịch bản đơn giản dưới đây thất bại trong việc kiểm tra cú pháp của ELSE khối INSERT INTO với lỗi của:Chèn SQL vào Bảng tạm thời trong cả hai khối If và Else

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

DECLARE @Id int 
SET @Id = 1 

IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable 

IF (@Id = 2) BEGIN 
    SELECT 'ABC' AS Letters 
    INTO #MyTestTable; 
END ELSE BEGIN 
    SELECT 'XYZ' AS Letters 
    INTO #MyTestTable; 
END 

tôi có thể tạo ra các bảng tạm thời trước khi tuyên bố IF/ELSE và sau đó chỉ cần làm INSERT SELECT báo cáo trong các khối có điều kiện, nhưng bảng sẽ có rất nhiều cột và tôi đã cố gắng để có hiệu quả về nó. Đó có phải là lựa chọn duy nhất không? Hay có cách nào để thực hiện công việc này?

Cảm ơn, Matt

Trả lời

5

Sự cố bạn gặp phải không phải là bạn đang điền bảng tạm thời, nhưng bạn đang cố gắng để tạo bảng. SQL phân tích cú pháp kịch bản lệnh của bạn và thấy rằng bạn đang cố gắng tạo ra nó ở hai nơi khác nhau, và do đó làm tăng một lỗi. Nó không đủ thông minh để nhận ra rằng "đường dẫn thực thi" không thể có thể đánh cả hai các statemements tạo ra. Sử dụng SQL động sẽ không hoạt động; Tôi đã thử

DECLARE @Command varchar(500) 

DECLARE @Id int 
SET @Id = 2 

IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable 

IF (@Id = 2) BEGIN 
    SET @Command = 'SELECT ''ABC'' AS Letters INTO #MyTestTable' 
END ELSE BEGIN 
    SET @Command = 'SELECT ''XYZ'' AS Letters INTO #MyTestTable' 
END 

EXECUTE (@Command) 

select * from #MyTestTable 

nhưng bảng tạm thời chỉ kéo dài miễn là phiên động. Vì vậy, than ôi, có vẻ như trước tiên bạn sẽ phải khai báo bảng và sau đó điền vào bảng. Mã vụng về để viết và hỗ trợ, có lẽ, nhưng nó sẽ thực hiện đủ hiệu quả.

+1

Câu trả lời của tôi không đề cập đến việc sử dụng SQL động - thực tế, nó chứng minh rằng SQL động * không thể được sử dụng để giải quyết vấn đề và kết luận cụ thể là khai báo bảng tạm thời trước khi chèn dữ liệu. . –

+0

Bạn có thể sử dụng SQL động và chèn vào bảng tạm thời toàn cục (## MyTesttable) và xóa bảng toàn cục sau đó. Sẽ thêm dưới dạng câu trả lời riêng – Rym

2

Trong kịch bản mà bạn cung cấp, bạn có thể làm điều này

DECLARE @Id int 
SET @Id = 1 

IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable 

SELECT 
    CASE WHEN (@Id = 2) 
    THEN 'ABC' 
    ELSE 'XYZ' 
    END AS Letters 
INTO #MyTestTable; 

Nhưng nếu không bạn sẽ cần phải tạo bảng trước khi if statement như thế này

Create Table #MyTestTable (
    MyValue varchar(3) 
) 
IF (@Id = 2) BEGIN 
    Insert Into (MyValue) 
    SELECT 'ABC' AS Letters; 
END ELSE BEGIN 
    Insert Into (MyValue) 
    SELECT 'XYZ' AS Letters; 
END 
+0

Có, đối với trường hợp này sẽ hoạt động. Nhưng các truy vấn thực tế phức tạp hơn nhiều. – CuppM

-1

Bạn có thể thả bảng trước khi CHỌN INTO trong cả hai trường hợp., ví dụ:

DECLARE @Id int 
SET @Id = 1 

IF (@Id = 2) BEGIN 
    IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable 
    SELECT 'ABC' AS Letters 
    INTO #MyTestTable; 
END ELSE BEGIN 
    IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable 
    SELECT 'XYZ' AS Letters 
    INTO #MyTestTable; 
END 

Update Sau Comment:

Đó là gây phiền nhiễu.

Làm thế nào về hai bảng tạm thời riêng biệt? Sau đó, sau khi đăng nhập If/Else, kiểm tra sự tồn tại của mỗi cái và nếu nó tồn tại, hãy chọn vào một bảng tạm thời thứ ba? Điều đó có thể không hoạt động tốt, nhưng liệu điều đó có quan trọng hay không phụ thuộc vào những gì bạn cần.

+0

Tôi đã thử điều đó. Tôi đặt 'IF OBJECT_ID ('tempdb .. # MyTestTable') IS NOT NULL DROP TABLE # MyTestTable' trong mỗi khối trước khi' INSERT INTO' statment, nhưng kết quả giống nhau. – CuppM

+0

Một downvote cho điều này? Có thật không? –

+0

Không phải tôi. Nhưng có lẽ đó là vì đề xuất của bạn không vượt qua kiểm tra cú pháp? Tôi nghĩ rằng 2 bảng tạm thời riêng biệt bắt đầu thực hiện nhiều công việc hơn là chỉ tạo bảng tạm thời trước 'IF/ELSE'. – CuppM

0

Đây là một vấn đề cũ, nhưng đối với bất cứ ai khác đến đây:

Câu trả lời SQL động đã được cấp bởi người dùng Philip Kelley không làm việc cho các bảng tạm cục bộ (#Mytemp). Những gì bạn có thể làm là tạo SQL động để chèn nó vào một bảng tạm thời toàn cầu (##MyTemp) mà sau này có thể bị loại bỏ.

DECLARE @Command varchar(500) 

DECLARE @Id int 
SET @Id = 2 

IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE ##MyTestTable 

IF (@Id = 2) BEGIN 
    SET @Command = 'SELECT ''ABC'' AS Letters INTO ##MyTestTable' 
END ELSE BEGIN 
    SET @Command = 'SELECT ''XYZ'' AS Letters INTO ##MyTestTable' 
END 

EXECUTE (@Command) 

select * from ##MyTestTable 

DROP ##MyTestTable 
0

mã này có thể giúp bạn

--creating temptable using columns of two existing tables 
--you can create your temp table Using other methods 

select top 0 VI.*,VU.FullName 
into #mytemptable 
from dbo.Items VI inner join 
    dbo.Users as VU 
    on VU.Id=VI.Id 

--insert your data base on your condition 
if(i<2) --First Condition 
begin 
INSERT INTO #mytemptable 
SELECT VI.*,VU.FullName 
from dbo.Items VI inner join 
    dbo.Users as VU 
    on VU.Id=VI.Id 
end 
Else if(2<i) --Second Condition 
begin 
INSERT INTO #mytemptable 
SELECT VI.*,VU.FullName 
from dbo.Items VI inner join 
    dbo.Users as VU 
    on VU.Id=VI.Id 
end 

select * from #mytemptable --show result 

drop table #mytemptable --drop table if its needed 

mã này làm việc trong máy chủ sql 2014 tôi không biết nếu nó hoạt động trong sql 2005 hoặc không

1

Trả lời 8 năm muộn, nhưng Tôi ngạc nhiên không ai nghĩ đến:

select * into #MyTempTable 
where 1=2 

IF -- CONDITION HERE 
insert into #MyTempTable select... 
ELSE 
insert into #MyTempTable select... 

Đơn giản, nhanh chóng và hoạt động. Không có sql động cần

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