2012-03-09 2 views
0

Рассмотрят приведенную ниже таблицу «sample_table»Выбор столбца, имя которого является зарезервированным SQL ключевым словом

id name desc 
------------------------- 
1  kkt kkt description 
1  skt skt description 

есть в любом случае я могу выбрать третий столбец, не используя его имя desc?

Попытка select desc from mytable выдает ошибку

Пожалуйста Suggest.

Спасибо,

Balan

+2

** NO ** вы не можете получить доступ к столбцы SQL Server числовым индексом .... и вы не должны, либо - порядок столбцов в реляционной таблице ** является бессмысленно **, и вы не должны писать какой-либо код, который полагается на это –

+5

Не без динамического sql, и если бы вы могли бы это быть * действительно плохой идеей. Что происходит, когда кто-то меняет порядок столбцов в таблице. – Jamiec

+0

Хорошо .. я не буду использовать этот метод .. Спасибо за упоминание .. – balanv

ответ

7

Я не понимаю, зачем вам это нужно, и я бы никогда не использовал.

declare @T table 
(
    id int, 
    name varchar(10), 
    description varchar(25) 
) 

insert into @T values 
(1,  'kkt', 'kkt description'), 
(1,  'skt', 'skt description') 

select T2.N.value('*[3]', 'varchar(max)') 
from (select * 
     from @T 
     for xml path('r'), type) as T1(X) 
    cross apply T1.X.nodes('/r') as T2(N) 

Update

Вы должны сделать, как это вместо.

select [desc] 
from YourTable 

Использовать [] вокруг имен столбцов, которые зарезервированы.

+0

, потому что в базе данных моего клиента они использовали поле «desc» для описания .. но когда я использую 'select desc from mytable ', это выдает ошибку. Вот почему я пытаюсь получить доступ к столбцу через индекс. – balanv

+6

@balanv - Вы должны использовать '[]' вокруг имен столбцов, которые зарезервированы. Обновленный ответ. –

0

ли эта помощь:

Declare @WhichOne int; 
Declare @Sql varchar(200); 
SET @WhichOne = 2; 
WITH cte AS 
(SELECT name, Row_Number() Over (ORDER BY column_id) AS rn 
FROM sys.COLUMNS 
WHERE Object_Name(object_id) = 'MyTable') 
SELECT @Sql = 'Select ' + QuoteName(name) + ' From MyTable' 
FROM cte 
WHERE rn = @WhichOne; 
Exec(@Sql); 

От http://www.daniweb.com/web-development/databases/ms-sql/threads/341388

0

Точно так же вы можете пойти стрелять себе в ногу, вот как вы могли бы сделать это с динамический код:

DECLARE @sql NVARCHAR(MAX) 
select 
    @sql = 'SELECT ' + COLUMN_NAME + ' FROM YourTable' 
from INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='YourTable' 
AND ORDINAL_POSITION=3 
exec sp_executeSQL @sql 
3

Используйте стандартные идентификаторы SQL, обозначенные вокруг имен столбцов, которые являются зарезервированными словами, например.

SELECT "desc" FROM sample_table; 
+0

'' 'desc \' 'работает, но' 'desc'' не работает для меня. Вы можете внести свой вклад в свой ответ'. –

+0

@VikasGautam: тогда это не стандартный SQL. MySQL? – onedaywhen

0

выбрать mytable.desc from mytable;

отлично работает для меня

Смежные вопросы