2010-05-25 22 views
7

Tôi muốn tạo bảng SQL sao lưu bằng cách sử dụng tên biến.Tạo bảng SQL sử dụng tên biến động

một cái gì đó dọc theo dòng của

DECLARE @SQLTable Varchar(20) 
SET @SQLTable = 'SomeTableName' + ' ' + '20100526' 
SELECT * INTO quotename(@SQLTable) 
FROM SomeTableName 

nhưng tôi nhận được

Incorrect syntax near '@SQLTable'.

Nó chỉ là một phần của một kịch bản nhỏ cho maintence vì vậy tôi không cần phải lo lắng về việc tiêm.

Trả lời

10
DECLARE @MyTableName nvarchar(20); 
DECLARE @DynamicSQL nvarchar(1000); 

SET @MyTableName = "FooTable"; 


SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable'; 

EXEC(@DynamicSQL); 
+5

@DynamicSQL exec nên là: exec (@DynamicSQL); - không có dấu ngoặc đơn, hãy ném "tên không phải là số nhận dạng hợp lệ". – plditallo

+1

Tôi có kết quả tương tự như @plditallo. Nếu không có dấu ngoặc đơn tôi nhận được lỗi: "Không thể tìm thấy thủ tục lưu trữ ..." EXEC không có dấu ngoặc cố gắng gọi một thủ tục. https://stackoverflow.com/questions/8382753/calling-exec-generates-error-could-not-find-stored-procedure –

6

Thật không may, bạn không thể sử dụng biến liên kết cho tên bảng, tên cột, v.v. Trong trường hợp này, bạn phải tạo SQL động và sử dụng exec.

4
DECLARE @Script NVARCHAR(MAX); 
SET @Script = N'SELECT * INTO SomeTableName_' + N'20100526' + N' FROM SomeTableName'; 
EXEC sp_executesql @Script 

Tôi đã bỏ ngày riêng biệt như tôi cho rằng bạn muốn tính toán cho mỗi lần chạy.

4

Bạn nên xem xét sử dụng từ đồng nghĩa:

- Tạo một từ đồng nghĩa với bảng Product trong AdventureWorks2008R2. TẠO SYNONYM Sản phẩm của tôi FOR AdventureWorks2008R2.Production.Product; GO

- Truy vấn bảng Sản phẩm bằng cách sử dụng từ đồng nghĩa. USE tempdb; GO SELECT ProductID, Tên TỪ Sản phẩm của tôi WHERE ProductID < 5; GO

http://msdn.microsoft.com/en-us/library/ms177544.aspx

+0

+1 cho một ý tưởng tuyệt vời! – Vaccano

0
DECLARE @MyTableName nvarchar(20); 
DECLARE @DynamicSQL nvarchar(1000); 

SET @MyTableName = "FooTable"; 


SET @DynamicSQL = N'SELECT * INTO ' + @MyTableName + ' FROM BarTable'; 

exec @DynamicSQL; 

truy vấn này là đúng nhưng chỉ cần sử dụng dấu nháy đơn tại ("FooTable") = 'FooTable'

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