2013-08-19 42 views
27

Tôi có vấn đề sau trong SQL Server, Tôi có một số mã mà trông như thế này:bảng tạm thời trong SQL server gây 'Đã có một đối tượng tên là' lỗi

DROP TABLE #TMPGUARDIAN 
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30), 
FRST_NAME NVARCHAR(30)) 

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN FROM TBL_PEOPLE 

Khi tôi làm điều này tôi nhận được một lỗi 'Đã có một đối tượng có tên' #TMPGUARDIAN 'trong cơ sở dữ liệu'. Bất cứ ai có thể cho tôi biết lý do tại sao tôi nhận được lỗi này?

Trả lời

51

Bạn đang thả nó, sau đó tạo nó, sau đó cố gắng tạo lại bằng cách sử dụng SELECT INTO. Thay đổi để:

DROP TABLE #TMPGUARDIAN 
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30), 
FRST_NAME NVARCHAR(30)) 

INSERT INTO #TMPGUARDIAN 
SELECT LAST_NAME,FRST_NAME 
FROM TBL_PEOPLE 

Trong MS SQL Server bạn có thể tạo một bảng mà không có một tuyên bố CREATE TABLE bằng cách sử dụng SELECT INTO

5

Bạn phải sửa đổi các truy vấn như thế này

CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30), 
FRST_NAME NVARCHAR(30)) 

INSERT INTO #TMPGUARDIAN(FRST_NAME,LAST_NAME) 
SELECT LAST_NAME,FRST_NAME FROM TBL_PEOPLE 

- Thực hiện một phiên cuối cùng để xóa tất cả các bảng tạm thời. luôn luôn giảm ở cuối. Trong trường hợp của bạn, đôi khi, có thể có lỗi xảy ra nếu bảng không tồn tại, trong khi bạn cố xóa.

DROP TABLE #TMPGUARDIAN 

Tránh sử dụng chèn vào Vì Nếu bạn đang sử dụng chèn vào sau đó trong tương lai nếu bạn muốn thay đổi bảng tạm thời bằng cách thêm một cột mới có thể được lấp đầy sau một quá trình (không cùng với chèn) . Vào thời điểm đó, bạn cần phải làm lại và thiết kế nó theo cách tương tự.

Sử dụng Bảng Variable http://odetocode.com/articles/365.aspx

declare @userData TABLE(
LAST_NAME NVARCHAR(30), 
    FRST_NAME NVARCHAR(30) 
) 

Ưu Không cần báo cáo Drop, vì đây sẽ là tương tự như các biến. Phạm vi kết thúc ngay lập tức sau khi thực hiện.

21

Tôi thường đặt những dòng này vào đầu thủ tục được lưu trữ của tôi và sau đó ở cuối.

Kiểm tra "tồn tại" cho #temp tables.

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL 
begin 
     drop table #MyCoolTempTable 
end 
+1

Trong trường hợp của tôi có vẻ như không đủ. Thực tế là tôi viết hai lần trong cùng một lựa chọn giống nhau "SELECT MyField INTO #TempTable" là đủ để gây ra lỗi biên dịch. Hai lựa chọn vào không thể được nhấn cùng một lúc bởi vì chúng nằm trong các nhánh khác nhau của IF THEN ELSE: tuy nhiên, tôi không thể viết hai lần cùng một SELECT INTO –

+0

Không sử dụng Select-Into. Đó là một "cắt ngắn". Tạo #tempTable, sử dụng cú pháp "Chèn vào #MyTemp Chọn Col1, Col2 từ dbo.MyTable". – granadaCoder

3

Một số lần, bạn có thể mắc sai lầm ngớ ngẩn như viết truy vấn chèn vào file sql cùng (trong không gian làm việc tương tự/tab) để khi bạn thực hiện truy vấn chèn nơi truy vấn tạo của bạn đã được viết ngay trên và đã thực hiện , nó sẽ lại bắt đầu thực hiện cùng với truy vấn chèn.

Đây là lý do tại sao chúng tôi nhận được tên đối tượng (tên bảng) đã tồn tại, vì nó được thực hiện lần thứ hai.

Vì vậy, hãy chuyển đến tab riêng để viết chèn hoặc thả hoặc bất kỳ truy vấn nào bạn sắp thực thi.

Hoặc khác dòng sử dụng bình luận trước tất cả các truy vấn trong không gian làm việc tương tự như

CREATE -- … 
-- Insert query 
INSERT INTO -- … 
0

Trong khi OP đã được thảo luận bàn, nếu đối tượng trong câu hỏi là một thủ tục lưu trữ, hãy chắc chắn rằng bạn sử dụng " thay đổi" chức năng:

ALTER THỦ TỤC

nếu bạn dán mã trong, yo u có thể cần phải thay thế "tạo" với "thay đổi" ... điều này chỉ xảy ra với tôi và là bực bội, vì vậy tôi hy vọng điều này xảy ra với người khác.