2011-02-03 56 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) 
相关问题