Tôi muốn để có thể chèn dữ liệu từ một bảng với một cột sắc vào một bảng tạm thời trong SQL Server 2005.Làm thế nào để giảm tài sản SẮC của cột trong SQL Server 2005
Các TSQL trông giống như sau:
-- Create empty temp table
SELECT *
INTO #Tmp_MyTable
FROM MyTable
WHERE 1=0
...
WHILE ...
BEGIN
...
INSERT INTO #Tmp_MyTable
SELECT TOP (@n) *
FROM MyTable
...
END
Đoạn mã trên đã tạo #Tmp_Table với cột nhận dạng và chèn sau thất bại với lỗi "Giá trị rõ ràng cho cột nhận dạng trong bảng '#Tmp_MyTable' chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT BẬT. "
Có cách nào trong TSQL thả thuộc tính nhận dạng của cột trong bảng tạm thời mà không liệt kê tất cả các cột rõ ràng không? Tôi đặc biệt muốn sử dụng "SELECT *" để mã sẽ tiếp tục hoạt động nếu các cột mới được thêm vào MyTable.
Tôi tin rằng việc thả và tạo lại cột sẽ thay đổi vị trí của nó, làm cho nó không thể sử dụng SELECT *.
Cập nhật:
Tôi đã cố gắng sử dụng IDENTITY_INSERT như đề xuất trong một phản ứng. Nó không hoạt động - xem repro bên dưới. Tôi đang làm gì sai?
-- Create test table
CREATE TABLE [dbo].[TestTable](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NULL,
CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
GO
-- Insert some data
INSERT INTO TestTable
(Name)
SELECT 'One'
UNION ALL
SELECT 'Two'
UNION ALL
SELECT 'Three'
GO
-- Create empty temp table
SELECT *
INTO #Tmp
FROM TestTable
WHERE 1=0
SET IDENTITY_INSERT #Tmp ON -- I also tried OFF/ON
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
SET IDENTITY_INSERT #Tmp OFF
GO
-- Drop test table
DROP TABLE [dbo].[TestTable]
GO
Lưu ý rằng các thông báo lỗi "Một giá trị rõ ràng cho cột sắc trong bảng '#TmpMyTable' chỉ có thể được xác định khi một danh sách cột được sử dụng và IDENTITY_INSERT ON." - Tôi đặc biệt không muốn sử dụng danh sách cột như được giải thích ở trên.
Cập nhật 2 Cố gắng the suggestion from Mike nhưng điều này đã đưa ra những lỗi tương tự:
-- Create empty temp table
SELECT *
INTO #Tmp
FROM (SELECT
m1.*
FROM TestTable m1
LEFT OUTER JOIN TestTable m2 ON m1.ID=m2.ID
WHERE 1=0
) dt
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
Đối với lý do tại sao tôi muốn làm điều này: MyTable là một bảng dàn mà có thể chứa một số lượng lớn hàng được sáp nhập vào một bảng khác. Tôi muốn xử lý các hàng từ bảng dàn dựng, chèn/cập nhật bảng chính của tôi và xóa chúng khỏi bảng dàn trong một vòng lặp xử lý N hàng trên mỗi giao dịch. Tôi nhận ra có nhiều cách khác để đạt được điều này.
Cập nhật 3
tôi không thể có được Mike's solution để làm việc, tuy nhiên nó gợi ý các giải pháp sau đây mà không làm việc: tiền tố với một cột không bản sắc và thả các cột sắc:
SELECT CAST(1 AS NUMERIC(18,0)) AS ID2, *
INTO #Tmp
FROM TestTable
WHERE 1=0
ALTER TABLE #Tmp DROP COLUMN ID
INSERT INTO #Tmp
SELECT TOP 1 * FROM TestTable
Đề xuất của Mike chỉ lưu trữ các khóa trong bảng tạm thời cũng là một gợi ý tốt, mặc dù trong trường hợp cụ thể này, có nhiều lý do tôi thích có tất cả các cột trong bảng tạm thời.
nó làm việc cho tôi, thấy tôi trả lời ... –
Bạn giải pháp trong Cập nhật 3 công trình tuyệt vời cho tôi. Tôi đã cố gắng để có được OUTPUT của một UPDATE vào một bảng tạm thời mà không xác định colums (khoảng 100!) – apc