2012-05-24 4 views
2

내가 원하는 select 문이 있습니다. 그래서 내가 열 이름의 행과 대응하는 단일 값이 나는 테이블 1 에서 특정 행입니다 값 이름이 다른 열을 만들 그러나SQL 스키마 및 값

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

을 선택합니다. 이것에 접근하는 방법에 대한 생각?

+0

table1의 "특정 행"이란 무엇입니까? SQL 쿼리에 상수를 추가 할 수 있습니다. 단지 'SELECT'Value'' –

답변

2

다음 쿼리는 각 열에 대한 값 (최소)을 생성합니다

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 

그러나 이렇게하면 각 행에 대해 별도의 쿼리가 생성됩니다. 이들을 함께 결합하려면 문자열 집계 연결이 필요합니다.

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

크로스 방금없이 가입 (즉, from t1, t2) 두 테이블에서 선택하면 암시 적 인 조인 사용

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

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

0

내가 실제로 미친 솔루션의 비트와 함께 와서 그러나 그것은 작동합니다 : 이것은 SQL 서버에서 그것을 할 것이다 어떻게

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 

그것은 각각의 값을 통해 반복하고 추가합니다. Fast_Forward 기능은 쿼리를 고성능으로 최적화합니다.