Schema și valoarea SQL

Am o declarație selectă pe care vreau să o fac. Vreau să aleg

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

Cu toate acestea, vreau să creez o altă coloană numită Valoare, care este un rând special în tabelul1 așa că am rânduri de nume de coloană și o singură valoare corespunzătoare. Orice gânduri despre cum să abordați acest lucru?

0
Cum adică "un anumit rând" din tabelul 1? Puteți adăuga o constantă la o interogare SQL, doar SELECT "Value"
adăugat autor N West, sursa

3 răspunsuri

Am gasit de fapt o solutie nebuna, dar functioneaza:

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

Se bifurcă prin fiecare valoare și o adaugă. Funcția Fast_Forward optimizează interogarea pentru performanțe ridicate

0
adăugat

Utilizați o conexiune încrucișată, care este implicită dacă selectați doar din două tabele care nu se conectează (adică de la t1, t2 ):

SELECT COLUMN_NAME AS FieldName,
       Table1.MyField
FROM
    INFORMATION_SCHEMA.COLUMNS, Table1
WHERE
    TABLE_NAME = 'table1'
AND
    MyTable.ID = 123
0
adăugat
adăugat autor marc_s, sursa

Următoarea interogare produce o valoare (minimă) pentru fiecare coloană:

    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

Cu toate acestea, aceasta produce o interogare separată pentru fiecare rând. Pentru a le combina, aveți nevoie de o concatenare agregată a șirului. Acesta este modul în care ați face acest lucru în 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
adăugat