2013-12-09 2 views
6

각 열에 대해 고유 한 값을 모두 표시하고 각 열의 레코드 수를 계산하는 코드 아이디어를 생각해 냈습니다. 코드가 모든 열을 반복하길 원합니다.동적 SQL을 사용하여 열 이름을 반복

Declare @sql varchar(max), 
@column as varchar(255) 

    set @column = '[Sales Manager]' 
    set @sql = 'select ' + @column + ',count(*) from [BT].[dbo].[test] group by ' + @column + 'order by 2 desc' 

    exec (@sql) 
: 동적 SQL에서

select [Sales Manager], count(*) 
    from [BT].[dbo].[test] 
    group by [Sales Manager] 
    order by 2 desc 

시도 : 여기

내가 너무 SQL noobness :

하드 코드를 견딜 새로운 해요 ... 내가 지금까지 가지고 무엇을

두 가지 모두 정상적으로 작동합니다. 어떻게 모든 열을 반복 할 수 있습니까? 열 이름을 열심히 코딩해야한다면 신경 쓸 필요가 없습니다. @column에 대해 각 열의 이름을 아래로 훑어 보는 방식으로 작동합니다.

의미가 있습니까?

감사합니다.

답변

5

동적 SQL을 사용하여 테이블의 모든 열 이름을 가져올 수 있습니다. (데이터베이스 또는 스키마 이름이없는) 테이블의 이름

Declare @sql varchar(max) = '' 
declare @tablename as varchar(255) = 'test' 

select @sql = @sql + 'select [' + c.name + '],count(*) as ''' + c.name + ''' from [' + t.name + '] group by [' + c.name + '] order by 2 desc; ' 
from sys.columns c 
inner join sys.tables t on c.object_id = t.object_id 
where t.name = @tablename 

EXEC (@sql) 

변경 @tablename : 그런 다음 스크립트를 구축 할 수 있습니다.

+1

이 코드를 사용해 보았습니다 ... 실행하는 것처럼 보였지만 뭔가 추가해야합니까? 거기에 루프가 보이지 않습니까? 건배, – Lucas

+1

루프가 필요하지 않은 모든 열에 대한 모든 쿼리는'@ sql' 변수에 있습니다. – Szymon

+0

안녕하세요. Szymon. 좋아, 나는 그것을 얻는다라고 생각한다. .. 하하. '명령이 성공적으로 완료되었습니다.'결과가 표시되지 않습니다 ... 코드의 어떤 부분을 내 값으로 변경해야합니까? – Lucas

8

이것은 약간의 XY 답이지만 열 이름을 하드 코딩해도 상관이 없다면 동적 SQL과 루프를 완전히 피하는 것이 좋습니다. 동적 SQL은 일반적으로 최후의 수단으로 간주되며주의하지 않으면 보안 문제 (SQL 주입 공격)가 발생하며 쿼리 및 실행 계획을 캐시 할 수없는 경우 느려질 수 있습니다.

열 이름이 많은 경우 간단한 대체 코드를 작성하거나 Word에서 편지 병합을 사용하여 대신 할 수 있습니다.


그러나, 지금까지이 SQL 서버, 당신은 다음과 같은 쿼리를 사용할 수있다 가정, 열 이름을 얻는 방법 등 :이 쿼리에서 동적 SQL을 구축 할 수 따라서

SELECT c.name 
FROM sys.columns c 
WHERE c.object_id = OBJECT_ID('dbo.test') 

를 :

SELECT 'select ' 
    + QUOTENAME(c.name) 
    + ',count(*) from [BT].[dbo].[test] group by ' 
    + QUOTENAME(c.name) 
    + 'order by 2 desc' 
FROM sys.columns c 
WHERE c.object_id = OBJECT_ID('dbo.test') 

커서를 사용하는 루프.

또는 전체를 하나의 일괄 처리로 컴파일하고 실행하십시오. 내가 탈출 필요가 열 이름을 탈출 the built-in QUOTENAME function을 사용하고

DECLARE @sql VARCHAR(MAX) = (
    SELECT ' select ' --note the extra space at the beginning 
     + QUOTENAME(c.name) 
     + ',count(*) from [BT].[dbo].[test] group by ' 
     + QUOTENAME(c.name) 
     + 'order by 2 desc' 
    FROM sys.columns c 
    WHERE c.object_id = OBJECT_ID('dbo.test') 
    FOR XML PATH('') 
) 

EXEC(@sql) 

참고 : 여기서 우리는 FOR XML PATH('') 트릭을 사용합니다.

관련 문제