Schéma SQL et valeur

J'ai une déclaration sélective que je veux faire. Je veux sélectionner

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

Cependant, je veux créer une autre colonne nommée Value qui est une ligne particulière dans la table1 J'ai donc des lignes du nom de la colonne et la valeur unique correspondante. 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'
ajouté l'auteur N West, source

3 Réponses

J'ai trouvé une solution un peu folle mais ça marche:

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

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

0
ajouté

Utilisez une jointure croisée, ce qui est implicite si vous sélectionnez simplement deux tables sans jointure (c'est-à-dire, de t1, t2 ):

SELECT COLUMN_NAME AS FieldName,
       Table1.MyField
FROM
    INFORMATION_SCHEMA.COLUMNS, Table1
WHERE
    TABLE_NAME = 'table1'
AND
    MyTable.ID = 123
0
ajouté
ajouté l'auteur marc_s, source

La requête suivante génère une valeur (le 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

Cependant, cela produit 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
ajouté