Помогите с TSQL - способ получить значение в N-м столбце строки? - PullRequest
3 голосов
/ 13 января 2009

Я надеюсь найти способ получить значение в N-ом столбце набора данных.

Таким образом, для N = 6 я хочу

SELECT (Column6Value) from MyTable where MyTable.RowID = 14

Есть ли способ сделать это в TSQL, как это реализовано в SQL Server 2005? Спасибо.

Ответы [ 5 ]

6 голосов
/ 13 января 2009

Вы должны иметь возможность присоединиться к системному каталогу (Information_Schema.Columns), чтобы получить номер столбца.

2 голосов
/ 13 января 2009

Это работает:

create table test (a int, b int, c int)
insert test values(1,2,3)

declare @column_number int
set @column_number = 2

declare @query varchar(8000)

select @query = COLUMN_NAME from information_Schema.Columns
where TABLE_NAME = 'test' and ORDINAL_POSITION = @column_number

set @query = 'select ' + @query + ' from test'

exec(@query)

Но почему вы когда-нибудь делаете что-то подобное, мне неведомо, какую проблему вы пытаетесь решить?

2 голосов
/ 13 января 2009

Не уверен, можете ли вы изменить дизайн таблицы, но если порядковый номер столбца значителен, ваши данные не нормализуются, и вам придется перепрыгивать через множество обручей для многих общих задач.

Вместо таблицы MyTable с Column1 ... ColumnN у вас будет дочерняя таблица с теми значениями, которые вы ранее сохраняли в Column1 ... ColumnN, каждое в отдельной строке.

Для тех случаев, когда вам действительно нужны эти значения в одной строке, вы можете сделать PIVOT: http://geekswithblogs.net/lorint/archive/2006/08/04/87166.aspx

Редактировать: мое предложение несколько спорным. Эш пояснил, что это «ненормализация по конструкции, это сводная модель, в которой каждая строка может содержать один из любых четырех типов данных». Да, такой дизайн может быть громоздким, когда вы его нормализуете.

0 голосов
/ 13 января 2009

Реализация ответа @Mike Sharek.

Declare @columnName varchar(255),
@tablename varchar(255), @columnNumber int, @SQL nvarchar(4000)
Set @tablename = 'MyTable'
Set @columnNumber = 6


Select @columnName = Column_Name from Information_SChema.columns
where Ordinal_position = @columnNumber and Table_Name = @tablename

Set @SQL  = 'select ' + @columnName + ' from ' + @tableName + ' where RowID=14'
Exec sp_Executesql @SQL

Я согласен с самбо - почему вы пытаетесь это сделать? Если вы вызываете код из C # или VB, гораздо проще взять 6-й столбец из набора результатов.

0 голосов
/ 13 января 2009

Если вы знаете диапазон n, вы можете использовать оператор case

Select Case when @n = 1 then Column1Value when @n = 2 then  Column2Value end 
from MyTable

Насколько я знаю, не существует динамического способа замены столбца (или таблицы) в операторе select без обращения к динамическому sql (в этом случае вам, вероятно, следует в любом случае рефакторинг)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...