2011-12-10 43 views
6

Tôi có một tên trường cơ sở dữ liệu cuộc gọi Code và tôi đang cố gắng để chọn nó sử dụng một tên biến như thế này dưới đây:động chọn cột trong truy vấn SQL

Declare @var1 = [Code] 

(SELECT @var1 
FROM [VoucherType] 
WHERE [DeletedBy] IS NULL 
AND [AutoID] = 1) 

Rõ ràng, SQL sẽ giải thích @var1 như là một chuỗi và không lĩnh vực của cơ sở dữ liệu của tôi, làm thế nào tôi có thể làm điều đó theo cách như vậy @var1 được công nhận là tên trường [Code] thay vì một chuỗi có thể mà không có bất kỳ lựa chọn hoặc báo cáo.

Trả lời

9

Hãy thử điều này:

DECLARE @var1 VARCHAR(20) 
DECLARE @sql VARCHAR(255) 

SET @var1 = 'Code' 
SET @sql = 'select ' + @var1 + ' from [VoucherType] where [DeletedBy] is null and [AutoID] = 1' 

EXEC sp_executesql @sql 

Bạn sẽ phải soạn truy vấn động và thực thi bằng cách sử dụng sp_executesql

Để thêm nhiều hơn về mặt 'động', hãy sử dụng các thủ tục được lưu trữ. Xem ở đây cho một ví dụ:

http://www.marten-online.com/database/execute-dynamic-sql-in-mssql.html

Đó là ... nếu bạn đang sử dụng Microsoft SQL SERVER

+0

+1 cho sp_executesql, và một câu trả lời tốt. –

+0

'+ @ var1 +' phải là '+ QUOTENAME (@ var1) +' để tránh các vấn đề về dấu cách và các ký tự đặc biệt khác có thể có trong tên cột. Nó cũng giúp ngăn ngừa các vấn đề tiêm có thể xảy ra. Ngoài ra, nếu bạn đang soạn danh sách được phân cách bằng dấu phẩy, mỗi tên cột riêng lẻ sẽ được chuyển qua QUOTENAME. – JamieSee

2

Bạn không thể sử dụng biến số như vậy trong câu lệnh SELECT.

Bạn sẽ cần phải tạo TSQL động.

Bạn không chỉ định RDBMS của bạn, nhưng trong SQL Server bạn sẽ sử dụng sp_executesql (tốt nhất) hoặc EXEC

Declare @var1 varchar(100) 
Declare @sql varchar(1000) 

SET @var1 = '[Code]' 
SET @sql = ' select ' + @var1 + ' from [VoucherType]' + 
      ' where [DeletedBy] is null and [AutoID] = 1' 

EXEC sp_executesql @sql 

Hãy chắc chắn để đọc: The Curse and Blessings of Dynamic SQL

2

Bạn cần phải sử dụng SQL động.

declare @ColName varchar(128) 

declare @sql varchar(4000) 

Set @ColName='Code'; 

select @sql = 'SELECT '[email protected]+' 
    FROM [VoucherType] 
WHERE [DeletedBy] IS NULL 
AND [AutoID] = 1' 
    exec sp_executesql @sql 
go 

bài này có thể hữu ích

Accessing a table from a name in a variable

SQL: Select dynamic column name based on variable

Trân

+1

'EXEC' nên tránh để ủng hộ' sp_executesql' vì nó hiệu quả hơn: [tham khảo] (http://msdn.microsoft.com/en-us/library/ms175170.aspx) –

0

Hãy thử với mã dưới đây:

DECLARE @ var1 VARCHAR (50)

SET @var1 = '[Code]' 

EXEC ('SELECT ' + @var1 + ' FROM [VoucherType] 
     WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ') 
+2

'EXEC' nên tránh để ủng hộ' sp_executesql' vì nó hiệu quả hơn: [tham khảo] (http://msdn.microsoft.com/en-us/library/ms175170.aspx) –

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