2009-03-27 36 views
6

Xét đoạn mã sau:TSQL Viết vào một bảng tạm thời từ động SQL

SET @SQL1 = 'SELECT * INTO #temp WHERE ...' 
exec(@SQL1) 
SELECT * from #temp (this line throws an error that #temp doesn't exist) 

Rõ ràng điều này là do lệnh exec quay ra một phiên riêng biệt và #temp là địa phương session đó. Tôi có thể sử dụng một bảng tạm thời toàn cầu ## temp, nhưng sau đó tôi phải đưa ra một lược đồ đặt tên để tránh va chạm. Tất cả các bạn khuyên tôi cái gì?

Trả lời

1

Không tìm thấy giải pháp khả thi mà đã làm mọi thứ tôi cần, vì vậy tôi đã chuyển sang sử dụng ## bảng tạm thời toàn cầu.

+10

Có thể xảy ra sự cố trong môi trường đa người dùng – Madhivanan

+0

@Madhivanan Vấn đề gì? – gotqn

5

Đã cố gắng tạo bảng mẫu một cách rõ ràng?

Create Table #temp (..) 
+4

Điều đó khắc phục vấn đề phạm vi. Tuy nhiên vì tôi không biết lược đồ cho đến khi câu lệnh exec được thi hành. (Trừ khi có một cách để tạo bảng mà không cần xác định lược đồ?) – Jeff

+0

# cho bạn biết rằng bạn đang sử dụng tempdb và tự động phân giải thành bảng thực trong tempdb với tên ngẫu nhiên cũ, ngăn ngừa xung đột. Bạn không cần tên lược đồ để đưa ra câu lệnh create, nhưng bạn nên làm điều đó bên ngoài SQL động. –

2

Bạn có thể tạo tạm thời trước khi thực hiện và sử dụng lệnh exec để điền bảng tạm thời.

+2

Làm cách nào để tạo bảng tạm thời mà không biết lược đồ? (Lựa chọn của tôi xác định lược đồ) – Jeff

1

Alternativley, bạn có thể sử dụng biến bảng.

Đây là một số article tốt để thảo luận về điều này.

+1

Điều này không giải quyết được vấn đề, bạn không thể 'CHỌN ... INTO' một biến bảng và nếu OP có sơ đồ bảng tĩnh được biết trước, chúng có thể dễ dàng sử dụng' Câu lệnh CREATE TABLE # temp'. Đề xuất biến bảng không cung cấp thêm chức năng nào. –

0

Bạn không thể đặt lựa chọn của mình sau khi chèn vào với a; delimeter và chạy hai báo cáo với nhau?

5

Hãy thử ## temp Do truy vấn động của bạn được thực hiện trên một sợi khác nên bạn không thể nhìn thấy bảng thời gian cục bộ của nó. thay vào đó, nếu bạn khai báo bảng tạm thời của mình như toàn cầu, hãy tạo cảm giác.

1

Một ví dụ, nhìn vào "thành"

SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity, 
     c.CustomerID, c.CompanyName, c.Address, c.City, c.Region, 
     c.PostalCode, c.Country, c.Phone, p.ProductID, 
     p.ProductName, p.UnitsInStock, p.UnitsOnOrder 
INTO #temp 
FROM Orders o 
JOIN [Order Details] od ON o.OrderID = od.OrderID 
JOIN Customers c ON o.CustomerID = c.CustomerID 
JOIN Products p ON p.ProductID = od.ProductID 
0

phương pháp khác là sử dụng tất cả các mã bên trong SQL động

SET @SQL1 = 'SELECT * INTO #temp WHERE ... 
SELECT * from #temp ' 
exec(@SQL1) 
0

Có một phương pháp của việc tạo ra giả bảng tạm thời với đơn cột nhận dạng, sau đó thay đổi bảng đó bằng lược đồ mong muốn thông qua SQL động và điền vào nó. Bằng cách đó, bạn có thể sử dụng bảng tạm thời cả hai động và SQL thông thường SQL, tham gia với nó ...

-- Create dummy table 
CREATE TABLE #tmpContactData (PK int NOT NULL IDENTITY(1,1)) 

-- Alter its schema 
DECLARE @sqlCommand nvarchar(max) 
SELECT @sqlCommand = ' 
ALTER TABLE #tmpContactData 
ADD 
    EmployeeId int, 
    Address varchar(100), 
    Phone varchar(50) 
' 
EXECUTE(@sqlCommand) 

-- Fill it 
SELECT @sqlCommand = ' 
INSERT INTO #tmpContactData 
SELECT t.EmployeeId, t.Address, t.Phone 
FROM ( SELECT EmployeeId=1000, Address=''Address 1000'', Phone=''Phone 1000'' 
     UNION 
     SELECT 1001, ''Address 1001'', ''Phone 1001'' 
     UNION 
     SELECT 1002, ''Address 1002'', ''Phone 1002'' 
) t 
' 
EXECUTE(@sqlCommand) 

--select from it 
SELECT * FROM #tmpContactData 

--CleanUp 
DROP TABLE #tmpContactData 
Các vấn đề liên quan