Est-il possible de sélectionner des données de colonne en utilisant ordinal_position pour une colonne de table? Je sais que l'utilisation de positions ordinales est une mauvaise pratique, mais pour un processus d'importation de données unique, je dois pouvoir utiliser la position ordinale pour obtenir les données de colonne.
Donc par exemple
create table Test(
Col1 int,
Col2 nvarchar(10)
)
à la place d'utiliser
select Col2 from Test
puis-je écrire
select "2" from Test -- for illustration purposes only
Tu devrais faire quelque chose comme
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)
Si vous connaissez le nombre de colonnes mais ne connaissez pas ses noms et types, vous pouvez utiliser le truc suivant:
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
En conséquence, vous aurez une table avec 2 colonnes [C1] et [C2] . Cette méthode n'est pas très utile si vous avez 100 colonnes dans votre table, mais elle fonctionne bien pour les tables avec un petit nombre de colonnes prédéfini. .
Vous pouvez utiliser cette requête
select * from information_schema.columns
pour obtenir les positions ordinales des colonnes. Comme Michael Haren l'a écrit, vous devrez créer une requête dynamique à l'aide de cette option, sous forme de code ou dans un sproc auquel vous transmettez les positions de colonne.
FWIW, c'est du mal pur.
En outre, deathofrats a raison, vous ne pouvez pas vraiment faire cela, car vous construirez une requête régulière avec des noms de colonnes basés sur la position.
Oui, vous pouvez le faire avec des résultats vraiment moches dans les tables système. Vous devrez probablement tomber dans le monde du SQL dynamique.
Je ne recommande vraiment pas vraiment cette approche.
Si cela ne vous dissuadait pas, cela pourrait vous aider à démarrer ( ref ):
select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
Si vous connaissez le nombre de colonnes, vous pouvez par exemple transférer les données dans une table tmp contenant ce nombre de colonnes et effectuer une sélection dans la table temporaire ...
declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant)
insert into @tmp
select * from Test
select field2 from @tmp
Non, vous ne pouvez pas sélectionner les colonnes en fonction de leur position ordinale, à ma connaissance.
Lorsque vous examinez la référence SQL de transaction, rien ne vous suggère que vous pouvez ( http://msdn.Microsoft.com/en-us/library/ms176104(SQL.90).aspx ).
Une option que vous avez utilise des conditions: Dans votre exemple:
SELECT
CASE YourColumnNumber
WHEN "1" THEN Col1
WHEN "2" THEN Col2
ELSE "?"
END AS Result
FROM Test
Aller au schéma va ralentir la requête, j'ai peur ...
Je ne pense pas que tu peux. Comme @Michael Haren l'a montré, vous pouvez utiliser des positions ordinales dans les clauses ORDER BY mais je ne les ai jamais vues utilisées ailleurs dans SQL Server.
Je ne suis pas sûr du problème que vous rencontrez avec votre importation ponctuelle de données que cela aiderait - probablement un nom de colonne malheureux? Pouvez-vous expliquer un peu plus?
Je ne connais aucun moyen de faire cela sans utiliser du SQL dynamique. Peut-être que si vous incluez un peu plus d'informations sur les raisons pour lesquelles vous estimez devoir utiliser les valeurs ordinales, une personne ici peut vous donner des conseils sur la façon de résoudre ce problème.
EDIT: Je vois que vous avez déjà répondu à cette question dans un autre commentaire. Pouvez-vous fournir plus de détails? Les définitions d'importation de proc et/ou de table?