2008-12-15 72 views
29

是否可以使用表列的ordinal_position選擇列數據?我知道使用序數位置是一種不好的做法,但對於一次性數據導入過程,我需要能夠使用序數位置來獲取列數據。是否可以使用列序號選擇sql server數據

因此,例如

create table Test(
    Col1 int, 
    Col2 nvarchar(10) 

) 

,而不是使用

select Col2 from Test 

可我寫

select "2" from Test -- for illustration purposes only 
+0

感謝大家抽出時間來回答我的問題。看起來我想要做的事情是無法完成的。 – rams 2008-12-15 16:01:18

+0

大鼠。我只是在輸入同樣的問題。 – MusiGenesis 2008-12-18 00:58:08

+0

偉大的問題。我只是想知道今天這是否可能。 – VISQL 2013-02-01 00:01:07

回答

2

是的,你可以用一些非常醜陋的命中進入系統表做到這一點。你可能需要陷入動態sql的世界。

我真的,真的不推薦這種方法。

如果這並沒有阻止你,那麼這可能讓你開始(ref):

select table_name, column_name, ordinal_position, data_type 
from information_schema.columns 
order by 1,3 
4

您可以使用此查詢

select * from information_schema.columns 

獲得列的序號位置。就像Michael Haren所寫的那樣,你必須使用這個動態查詢來建立一個動態查詢,無論是在代碼中還是在你傳遞列位置的sproc中。

FWIW,這是純粹的邪惡。

此外,deathofrats是正確的,你不能這樣做,因爲你會建立一個基於位置的列名定期查詢。

+3

喜歡「純粹的邪惡」言論:) – 2010-08-24 19:36:13

0

我不認爲你可以。正如@Michael Haren所示,您可以在ORDER BY子句中使用序數位置,但是我從未在SQL Server的其他地方看到過它們。

我不確定你的一次性數據導入有什麼問題,這將有助於 - 大概是一些不幸的列名?你能多解釋一下嗎?

+0

@robsoft - 我正在使用一個使用映射信息的數據庫。 Col名稱存儲在映射表中。具有巨大case語句的proc會運行import,並且我正在嘗試改進它。使用動態SQL並沒有加速這個過程。 – rams 2008-12-15 14:43:41

13

你不得不這樣做

declare @col1 as varchar(128) 
declare @col2 as varchar(128) 
declare @sq1 as varchar(8000) 

select @col1 = column_name from information_schema.columns where table_name = 'tablename' 
and ordinal_position = @position 

select @col2 = column_name from information_schema.columns where table_name = 'tablename' 
and ordinal_position = @position2 

set @sql = 'select ' + col1 ',' + col2 'from tablename' 

exec(@sql) 
0

我不知道有什麼辦法做到這一點短期使用動態SQL的。也許如果你包含更多關於爲什麼你覺得你必須使用序數值的信息,那麼這裏的某個人可以給你如何解決這個問題的建議。

編輯:我看到你在另一個評論中回答了這個問題。你能提供更多細節嗎?導入過程和/或表定義?

-5

如果您使用MS SQL 2005,則可以使用ROW_NUMBER函數。

SELECT Col1中,col2的,ROW_NUMBER()OVER(ORDER BY Col1中) 測試從 WHERE ROW_NUMBER()OVER(ORDER BY Col1中)之間@Position和@Position

,應該讓你期望的結果,如果我正確地閱讀了這個問題。

1

如果你知道的列數,一個方法可能是將數據與列數轉移到tmp目錄表,並從臨時表中選擇...

declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant) 

insert into @tmp 
select * from Test 

select field2 from @tmp 
8

如果你知道的數量列,但不知道它的名稱和類型,可以使用以下技巧:

select NULL as C1, NULL as C2 where 1 = 0 
-- Returns empty table with predefined column names 
union all 
select * from Test 
-- There should be exactly 2 columns, but names and data type doesn't matter 

其結果是,你將有2列[C1]及[C2]表。 如果表格中有100列,此方法並不是非常有用,但對於預定義列數較少的表格,此方法效果很好。

0

你有一個選擇是使用條件: 在您的例子:

SELECT 
    CASE YourColumnNumber 
     WHEN "1" THEN Col1 
     WHEN "2" THEN Col2 
     ELSE "?" 
    END AS Result 
    FROM Test 

要架構將降低查詢恐怕......

相關問題