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
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)
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 .
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.
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
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
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.
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 ...
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?
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?