2011-11-07 27 views
25

Đã cố gắng chọn ... vào bảng tạm thời #TempTable trong sp_Executedsql. Không được chèn thành công hay không nhưng có Tin nhắn có viết (359 hàng bị ảnh hưởng) có nghĩa là đã được chèn thành công? Tập lệnh bên dướiThực hiện sp_executeSql để chọn ... thành #table nhưng không thể chọn ra Bảng dữ liệu Temp

DECLARE @Sql NVARCHAR(MAX); 
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable 
      from SPCTable with(nolock) 
      where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To'; 

SET @Sql = 'DECLARE @Date_From VARCHAR(10); 
      DECLARE @Date_To VARCHAR(10); 
      SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+'''; 
      '+ @Sql; 

EXECUTE sp_executesql @Sql; 

Sau khi thực hiện, trả lại thư cho tôi (359 hàng bị ảnh hưởng). Tiếp theo khi cố gắng chọn dữ liệu từ #TempTable.

Select * From #TempTable; 

nó trở lại tôi:

Msg 208, Level 16, State 0, Line 2 
Invalid object name '#TempTable'. 

nghi ngờ chỉ là 'chọn' phần làm việc của mình mà thôi. Chèn không hoạt động. cách khắc phục sự cố?

Trả lời

25

Local bảng tạm thời #table_name có thể nhìn thấy trong phiên hiện tại duy nhất, toàn cầu tạm ##table_name bảng có thể nhìn thấy trong tất cả các phiên. Cả hai cuộc sống cho đến khi phiên của họ được đóng lại. sp_executesql - tạo phiên riêng của mình (có thể từ "phạm vi" sẽ tốt hơn) vì vậy đó là lý do tại sao nó xảy ra.

+2

Tôi nghĩ từ "phạm vi" sẽ tốt hơn. 'DECLARE @sql NVARCHAR (MAX); SET @sql = 'SELECT @@ SPID'; EXECUTE sp_executesql @sql; SELECT @@ SPID' –

+0

Cảm ơn @Michal, tôi đã nhớ lại phương pháp sử dụng này.Thanks lại – Worgon

+0

Câu hỏi là cách khắc phục. Không phải lý do tại sao nó phá vỡ. Tôi đã cung cấp câu trả lời đúng dưới đây. 'INSERT INTO @tmpTbl EXEC sp_executesql @ sql' –

5

bảng tạm thời của bạn trong SQL động nằm ngoài phạm vi trong phần SQL không động.

Nhìn đây làm thế nào để đối phó với điều này: A bit about sql server's local temp tables

3

Bảng tạm thời chỉ hoạt động miễn là kết nối tạo ra chúng. Tôi hy vọng rằng bạn đang vô tình phát hành lựa chọn trên một kết nối riêng biệt. Bạn có thể kiểm tra điều này bằng cách tạm thời chèn của bạn vào một bảng không tạm thời và xem liệu dữ liệu của bạn có ở đó hay không. Nếu đó là trường hợp bạn có thể quay trở lại giải pháp ban đầu của bạn và chỉ cần chắc chắn để vượt qua các đối tượng kết nối để lựa chọn của bạn.

29

Sử dụng bảng tạm thời toàn cục trong trường hợp này có thể gây ra sự cố vì bảng sẽ tồn tại giữa các phiên và có thể dẫn đến một số sự cố khi sử dụng mã gọi không đồng bộ.

Bảng tạm thời cục bộ có thể được sử dụng nếu được xác định trước khi gọi sp_executesql, ví dụ:

CREATE TABLE #tempTable(id int); 

sp_executesql 'INSERT INTO #tempTable SELECT myId FROM myTable'; 

SELECT * FROM #tempTable; 
1

Để khắc phục sự cố này, sử dụng lệnh CREATE TABLE #TEMPTABLE trước để tạo bảng tạm thời trống trước khi chạy sp_executesql. Sau đó chạy INSERT INTO #TEMPTABLE với sp_executesql. Điều này sẽ làm việc. Đây là cách tôi khắc phục vấn đề này khi tôi có một thiết lập trong đó tất cả các truy vấn của tôi thường chạy qua sp_executesql.

1
declare @sql varchar(1000) 
set @sql="select * into #t from table;" 
set @sql [email protected] + "select * from #t;" 

execute SP_EXECUTESQL @sql 
4

Trong chuỗi @sql, không chèn into #TempTable. Thay vào đó, hãy gọi cho câu hỏi SELECT của bạn mà không cần tuyên bố INSERT.

Cuối cùng, chèn kết quả vào bảng tạm thời của bạn như vậy:

INSERT INTO @tmpTbl EXEC sp_executesql @sql 
Các vấn đề liên quan