web-dev-qa-db-fra.com

Il est possible de terminer les données du serveur SQL en utilisant la position ordinaire

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
31
rams

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

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

11
Pavel Sinkevich

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. 

5
Booji Boy

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
2
Michael Haren

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
1
craigl

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

1
Eric Minkes

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

0
Damien Goor

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?

0
robsoft

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?

0
Tom H