2009-01-12 69 views
3

我希望找到一種方法來獲取數據集第N列中的值。TSQL幫助 - 一種獲取行中第N列值的方法?

因此,對於N = 6我想

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

有沒有一種方式,在SQL Server 2005中實現這樣做在TSQL?謝謝。

+0

你實際上需要表中的第n列,而不是數據集。要弄清楚你的源是否是Join,將會困難得多。 – 2009-01-12 21:59:08

+0

您是否熟悉PIVOT SQL表達式? – dkretz 2009-01-12 22:23:14

回答

6

您應該可以加入系統目錄(Information_Schema.Columns)以獲取列號。

+0

這就是我所嘲笑的! SELECT * FROM Information_Schema.Columns WHERE TABLE_NAME = @tablename AND ORDINAL_POSITION = 6 – 2009-01-12 22:05:04

0

如果你知道的n你可以使用一個case語句

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

據我知道有沒有動態的方式來代替select語句的列(或表),而不訴諸動態sql(在這種情況下,你應該可能重構反正)

2

不知道你是否可以自由重新設計表,但是如果列的序號位置很重要,你的數據沒有被標準化,你將要必須跳過許多常見任務。

而不是使用表格MyTable與Column1 ... ColumnN你將有一個你以前存儲在Column1 ... ColumnN每個在他們自己的行這些值的子表。

對於那些時候,你真的需要這些值在單行,然後你可以做一個PIVOT:http://geekswithblogs.net/lorint/archive/2006/08/04/87166.aspx

編輯:我的建議是有點無實際意義。 Ash澄清說,它是「通過設計去規範化的,這是一個樞軸模型,每行可以包含任何四種數據類型之一。」是的,當你規範化它時,那種設計會很麻煩。

+0

+1對於序號位置的評論應該沒有關係。如果你依靠某一列的位置,那麼你總有一天會遇到問題。 – 2009-01-12 22:03:50

+0

>>「但是如果列的順序位置很重要,那麼你的數據沒有被標準化」 這是通過設計去標準化的,它是一個樞軸模型,每行可以包含任意四種數據類型之一。 – 2009-01-12 22:06:59

2

這工作:

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) 

但是,爲什麼你會不會做這樣的事我是無法理解,什麼問題是你想解決?

0

@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列更容易。