2009-01-12 3 views
3

J'espère trouver un moyen d'obtenir la valeur dans la Nième colonne d'un ensemble de données.Aide avec TSQL - un moyen d'obtenir la valeur dans la Nième colonne d'une ligne?

Ainsi, N = 6 Je veux

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

Est-il possible de le faire dans TSQL mis en œuvre dans SQL Server 2005? Merci.

+0

vous voulez réellement la nième colonne d'une table, pas un jeu de données. Il serait beaucoup plus difficile de déterminer si votre source était une jointure. –

+0

Connaissez-vous les expressions SQL PIVOT? – dkretz

Répondre

6

Vous devriez pouvoir joindre le catalogue système (Information_Schema.Columns) pour obtenir le numéro de colonne.

+0

C'est ce que je cherchais! SELECT * FROM Information_Schema.Columns OERE TABLE_NAME = @nom_table ET ORDINAL_POSITION = 6 –

0

Si vous connaissez la gamme de n, vous pouvez utiliser une déclaration de cas

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

Pour autant que je sais qu'il n'y a aucun moyen dynamique pour remplacer une colonne (ou tableau) dans une instruction select sans avoir recours à dynamique sql (dans lequel chase vous devriez probablement refactor de toute façon)

2

Vous ne savez pas si vous êtes libre de reconcevoir la table, mais si la position ordinale de la colonne est significative, vos données ne sont pas normalisées et vous allez avoir à sauter à travers beaucoup de cerceaux pour de nombreuses tâches courantes. Au lieu d'avoir table MyTable avec Column1 ... ColumnN, vous auriez une table enfant de ces valeurs que vous avez précédemment stockées dans Column1 ... ColumnN chaque dans leur propre ligne.

Pour les moments où vous avez vraiment besoin de ces valeurs dans une seule ligne, vous pouvez alors faire une PIVOT: http://geekswithblogs.net/lorint/archive/2006/08/04/87166.aspx

Edit: Ma suggestion est quelque peu discutable. Ash a précisé qu'il s'agit d'une «dé-normalisation par conception, c'est un modèle pivot où chaque rangée peut contenir l'un des quatre types de données». Oui, ce genre de design peut être lourd quand on le normalise.

+0

+1 pour commentaire sur la position ordinale ne devrait pas importer. Vous rencontrerez des problèmes un jour si vous comptez sur la position d'une colonne. –

+0

>> "mais si la position ordinale de la colonne est significative, vos données ne sont pas normalisées" Il s'agit d'une dénormalisation par conception, c'est un modèle pivot où chaque ligne peut contenir l'un des quatre types de données. –

+0

Je n'ai presque pas posté cela, car souvent nous les programmeurs ne sommes pas libres de changer la structure de la table, mais maaaan ... cela ressemble à une structure de table qui va causer beaucoup de douleur. –

2

Cela fonctionne:

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) 

Mais pourquoi vous jamais faire quelque chose comme cela est au-delà de moi, ce sont les problèmes que vous essayez de résoudre?

+0

J'essaie de résoudre un problème avec une procédure stockée en utilisant une structure de données qui ne suit pas la première forme normale. –

0

Implémentation de la réponse de @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 

Je suis d'accord avec Sambo - pourquoi vous essayez de le faire? Si vous appelez le code à partir de C# ou VB, il est beaucoup plus facile de récupérer la 6ème colonne à partir d'un jeu de résultats.

+0

Je fais ceci dans une procédure stockée, et ne faisant aucune supposition au sujet de l'appel de client. –

Questions connexes