2012-05-24 1 views
2

J'ai une instruction select que je veux faire. Je veux choisirSchéma SQL et valeur

SELECT COLUMN_NAME AS FieldName FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'table1' 

Cependant, je veux créer une autre colonne nommée valeur qui est une ligne particulière dans le tableau 1 donc j'ai lignes du nom de la colonne et la valeur unique correspondant. Des idées sur la façon d'aborder cela?

+0

Que voulez-vous dire «une ligne particulière» dans la table 1? Vous pouvez ajouter une constante à une requête SQL, juste 'SELECT 'Value'' –

Répondre

2

La requête suivante produit une valeur (minimum) pour chaque colonne:

SELECT '''select '+COLUMN_NAME+''' AS FieldName, (select cast(MIN('+COLUMN_NAME+') as varchar(8000)) from '+const.tablename+')' 
    FROM INFORMATION_SCHEMA.COLUMNS c cross join 
     (select 'AllCurveNames' as tablename) const 
    WHERE c.TABLE_NAME = const.tablename 

Toutefois, cela génère une requête distincte pour chaque ligne. Pour les combiner ensemble, vous avez besoin d'une concaténation d'agrégat de chaînes. Voici comment vous le feriez dans SQL Server:

declare @sql varchar(max); 

    SELECT @sql = (select 'select '''+COLUMN_NAME+''' AS FieldName, (select cast(MIN('+COLUMN_NAME+') as varchar(8000)) from '+const.tablename + ') union all ' 
        FROM INFORMATION_SCHEMA.COLUMNS c cross join 
         (select WHATEVER as tablename) const 
        WHERE c.TABLE_NAME = const.tablename 
        for xml path('') 
       ); 
    select @sql = LEFT(@sql, len(@sql) - 9); 
    exec(@sql); 
0

Utilisez une jointure croisée, ce qui est implicite si vous venez de choisir entre deux tables sans jointure (c.-à-from t1, t2):

SELECT COLUMN_NAME AS FieldName, 
     Table1.MyField 
FROM 
    INFORMATION_SCHEMA.COLUMNS, Table1 
WHERE 
    TABLE_NAME = 'table1' 
AND 
    MyTable.ID = 123 
+0

Voir http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx –

0

En fait, je suis venu avec une peu d'une solution fou, mais cela fonctionne:

declare @tbl_name as varchar(255) 
declare @field as varchar(255) 
declare @val as varchar(255) 
declare @SQL as nvarchar(4000) 

create table #tbl ([FieldName][varchar](255), [FieldVal][varchar](255)) 

set @tbl_name = 'table1' 

DECLARE mah_cursor CURSOR FAST_FORWARD 
FOR 
SELECT COLUMN_NAME FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @tbl_name 

OPEN mah_cursor 

FETCH NEXT FROM mah_cursor INTO @field 

WHILE @@FETCH_STATUS = 0 
BEGIN 



set @SQL = 'set @val = (Select top 1 ' + @field + ' from ' + @tbl_name + ')' 
print @SQL 


exec sp_executesql @query = @SQL, @params = N'@val varchar(255) OUTPUT', @val = @val  OUTPUT 

insert into #tbl ([FieldName],[FieldVal]) values (@field, @val) 

FETCH NEXT FROM mah_cursor INTO @field 
END 

CLOSE mah_cursor 
DEALLOCATE mah_cursor 

select * from #tbl 

drop table #tbl 

boucle sur chaque valeur et l'ajoute. La fonction Fast_Forward optimise la requête pour des performances élevées