2011-02-03 53 views
6

有沒有辦法通過SQL Server中的存儲過程中的索引訪問列?在SQL Server存儲過程中通過索引而不是名稱訪問表的列

其目的是計算大量的列。我正在閱讀遊標,但我不知道如何應用它們。

讓我解釋一下我的問題:

我有一排這樣的:

field_1 field_2 field_3 field_4 ...field_d Sfield_1 Sfield_2 Sfield_3...Sfield_n 
1  2  3  4   d  10  20  30   n 

我需要計算像(field_1*field1) - (Sfield_1* Sfiled_1)/more...

所以結果存儲在表列d倍。

所以結果是d column * d row表。

由於列數是可變的,我正在考慮製作動態SQL,獲取字符串中列的名稱並拆分我需要的列,但這種方法會使問題變得更加困難。我認爲通過索引獲得列號可以使生活更輕鬆。

+1

的[是否有可能使用柱順序位置選擇SQL Server數據]可能的複製(http://stackoverflow.com/questions/368505/is-it-possible-to-select-sql-server-數據使用列順序位置) – 2015-10-07 05:40:26

回答

3

首先,如OMG Ponies所述,您不能通過它們的序號位置來引用列。這不是意外。 SQL規範不是爲DDL或DML中的動態模式構建的。

鑑於這一點,我不得不想知道爲什麼你的數據結構與你一樣。當您嘗試提取信息時,架構和問題域之間不匹配的跡象會自動增加。當查詢編寫起來非常麻煩時,這表明模式沒有正確地爲其設計的域建模。

然而,是因爲它可以給你告訴我們,一個替代的解決方案是類似以下內容:(我假設field_1*field1本來是field_1 * field_1field_1方形或Power(field_1, 2)

Select 1 As Sequence, field_1 As [Field], Sfield_1 As [SField], Sfiled_1 As [SFiled] 
Union All Select 2, field_2, Sfield_2, Sfiled_2 
... 
Union All Select n, field_n, Sfield_n, Sfiled_n 

現在你的查詢看起來像:

With Inputs As 
    (
    Select 1 As Sequence, field_1 As [Field], Sfield_1 As [SField], Sfiled_1 As [SFiled] 
    Union All Select 2, field_2, Sfield_2, Sfiled_2 
    .... 
    ) 
    , Results As 
    (
    Select Case 
      When Sequence = 1 Then Power([Field], 2) - ([SField] * [SFiled]) 
      Else 1/Power([Field], 2) - ([SField] * [SFiled]) 
      End 
      As Result 
    From Inputs 
    ) 
Select Exp(Sum(Log(Result))) 
From Results 
6

不,您不能使用SELECT子句中的序號(數字)位置。

只有在ORDER BY子句中,您可以使用序號位置,因爲它基於SELECT子句中指定的列。

+0

怎樣才能解決問題? – cMinor 2011-02-03 05:40:11

+0

@darkcminor:按名稱引用列。如果您願意,可以使用動態SQL來獲取列名列表,但列順序與數據庫無關。我忘了提及一些數據庫支持GROUP BY和HAVING中的序數。另一種方法是重新設計色譜柱以滿足您的需求。 – 2011-02-03 05:43:12

0

這可能不是最優雅的或有效的,但它的工作原理。我正在使用它來創建一個新表,以便我需要通過所有列/行解析數據之間的更快映射。

DECLARE @sqlCommand varchar(1000) 
DECLARE @columnNames TABLE (colName varchar(64), colIndex int) 
DECLARE @TableName varchar(64) = 'YOURTABLE' --Table Name 
DECLARE @rowNumber int = 2 -- y axis 
DECLARE @colNumber int = 24 -- x axis 

DECLARE @myColumnToOrderBy varchar(64) = 'ID' --use primary key 

--Store column names in a temp table 
INSERT INTO @columnNames (colName, colIndex) 
SELECT COL.name AS ColumnName, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) 
    FROM sys.tables AS TAB 
    INNER JOIN sys.columns AS COL ON COL.object_id = TAB.object_id 
    WHERE TAB.name = @TableName 
    ORDER BY COL.column_id; 

DECLARE @colName varchar(64) 
SELECT @colName = colName FROM @columnNames WHERE colIndex = @colNumber 

--Create Dynamic Query to retrieve the x,y coordinates from table 
SET @sqlCommand = 'SELECT ' + @colName + ' FROM (SELECT ' + @colName + ', ROW_NUMBER() OVER (ORDER BY ' + @myColumnToOrderBy+ ') AS RowNum FROM ' + @tableName + ') t2 WHERE RowNum = ' + CAST(@rowNumber AS varchar(5)) 
EXEC(@sqlCommand) 
相關問題