wake-up-neo.com

Ist es möglich, SQL Server-Daten anhand der Position der Spalte ordinal auszuwählen

Ist es möglich, Spaltendaten anhand der ordinal_position für eine Tabellenspalte auszuwählen? Ich weiß, dass die Verwendung von Ordinalpositionen eine schlechte Praxis ist, aber für einen einmaligen Datenimportprozess muss ich in der Lage sein, die Ordinalposition zum Abrufen der Spaltendaten zu verwenden.

Also zum Beispiel 

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

)

anstatt zu verwenden

select Col2 from Test

kann ich schreiben

select "2" from Test -- for illustration purposes only
31
rams

Sie müssten etwas tun 

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)
14
Booji Boy

Wenn Sie die Anzahl der Spalten kennen, deren Namen und Typen jedoch nicht kennen, können Sie den folgenden Trick verwenden:

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

Als Ergebnis haben Sie eine Tabelle mit 2 Spalten [C1] und [C2] . Diese Methode ist nicht sehr nützlich, wenn Sie 100 Spalten in Ihrer Tabelle haben, aber sie eignet sich gut für Tabellen mit einer kleinen vordefinierten Anzahl von Spalten .

11
Pavel Sinkevich

Sie können diese Abfrage verwenden 

select * from information_schema.columns

um die Ordinalpositionen der Spalten zu erhalten. Wie Michael Haren schrieb, müssen Sie eine dynamische Abfrage erstellen, entweder in Code oder in einem Sproc, an den Sie die Spaltenpositionen übergeben. 

FWIW, das ist reines Übel. 

Deathofrats hat auch Recht, Sie können dies nicht wirklich tun, da Sie eine regelmäßige Abfrage mit Spaltennamen basierend auf der Position erstellen. 

5
Booji Boy

Ja, Sie könnten dies mit einigen wirklich hässlichen Treffern in den Systemtabellen tun. Sie müssten wahrscheinlich in die Welt der dynamischen SQL fallen. 

Ich kann diesen Ansatz wirklich nicht empfehlen.

Wenn Sie sich nicht davon abhalten lassen, könnte dies den Einstieg erleichtern ( ref ):

select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
2
Michael Haren

Wenn Sie die Anzahl der Spalten kennen, besteht eine Möglichkeit darin, die Daten in eine tmp-Tabelle mit dieser Anzahl von Spalten zu übertragen und aus der temporären Tabelle auszuwählen ...

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

insert into @tmp
select * from Test

select field2 from @tmp
1
craigl

Nein, Sie können, soweit ich weiß, keine Spalten anhand ihrer Ordinalposition auswählen.

Wenn Sie sich die Transact-SQL-Referenz ansehen, deutet nichts darauf hin, dass Sie ( Http://msdn.Microsoft.com/en-us/library/ms176104(SQL.90).aspx ) können.

1
Eric Minkes

Eine Option, die Sie haben, ist die Verwendung von Bedingungen: In Ihrem Beispiel:

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

Wenn ich zum Schema gehe, verlangsame ich mich ...

0
Damien Goor

Ich glaube nicht, dass du das kannst. Wie @Michael Haren zeigte, können Sie Ordinalpositionen in ORDER BY-Klauseln verwenden, aber ich habe sie noch nie an anderer Stelle in SQL Server gesehen.

Ich bin nicht sicher, welches Problem Sie mit Ihrem einmaligen Datenimport haben, bei dem dies helfen würde - vermutlich ein unglücklicher Spaltenname? Kannst du etwas mehr erklären?

0
robsoft

Ich kenne keinen Weg, um dies zu tun, ohne dynamisches SQL zu verwenden. Wenn Sie ein wenig mehr Informationen dazu einschließen, warum Sie die Ordnungswerte verwenden müssen, die jemand hier verwendet, können Sie Ratschläge erhalten, wie Sie dieses Problem umgehen können.

EDIT: Ich sehe, dass Sie dies in einem anderen Kommentar zu einem gewissen Grad beantwortet haben. Können Sie weitere Einzelheiten angeben? Die Importprozedur und/oder Tabellendefinitionen?

0
Tom H