2014-07-08 1 views
0

variouse 입력 매개 변수를 기준으로 약 20 개의 열을 추가하거나 제거해야합니다. 나는 CASE 문에서 각 줄을 감쌀 수 있다는 것을 알고 있지만, 열 세트에 10 개의 열을 추가 할 필요가있을 때는 여분의 코드 톤이 필요합니다. 동적 SQL 괴물을 만드는 방법은 무엇입니까?입력 매개 변수에 따라 열 집합을 동적으로 추가하려면 어떻게합니까?

DECLARE @AddColumns AS NVARCHAR(20) = 'Column Set 1' 

SELECT 
    col1 
    , col2 
    , CASE WHEN @AddColumns = 'Column Set 1' OR @AddColumns = 'Include All Columns' 
     THEN col3, col4, col5, col6, col7 
    END 
    , CASE WHEN @AddColumns = 'Column Set 2' OR @AddColumns = 'Include All Columns' 
     THEN col8, col9, col10 
    END 
    , col11 

FROM MyTable 
+0

모든 열을 선택하고 클라이언트에서 처리하려는 특별한 이유가 있습니까? –

+0

@Conrad, VB에서 데이터 집합을 사용하고 있으므로 좋은 생각입니다. 그러나 삭제할 열 이름이 길기 때문에 데이터 집합에서 행을 제거하는 if..thens가 복잡해집니다. – BClaydon

+1

두 가지 옵션이 1) 입력을 기반으로 다른 쿼리를 실행하는 큰 IF 문이거나 2) sp_executeSQL을 호출하는 경우입니다. 이 두 가지 접근 방식의 큰 단점은 동적 열을 사용하는 쿼리를 둘러싼 툴링이 그렇게 크지 않다는 것입니다. –

답변

0

을 시도해보십시오 최종 사용자가 열 세트 1이 필요로 할 때 반환 5 특정 열을 - 여기

내가 할 노력하고있어의 예 동적 SQL, ExecuteSql의 옵션, VB에서 SQL 문자열 만들기 또는 결과 VB 데이터 집합 편집 VB에서 동적으로 SQL 문자열을 작성하는 방법을 살펴 보았습니다. 나는 SQL에서 이것을하는 '쉬운'방법을 찾고 있었다. 그것은 SQL에서 할 수 있지만, VB에서 그것을 할 나를 위해 '청소기'입니다. (죄송합니다. 원래 질문에서 VB에서 쿼리를 사용하고 있다고 언급 했어야합니다.) 각 SQL 집합을 여러 개 만들면 대략 5 ~ 10 개 열, 여러 조인, 매개 변수가있는 필터 등을 추가하는 많은 열 집합을 상상해보십시오. 부품 및 입력 매개 변수에 따라 함께 추가합니다.

' Build the various chunks of SQL as CDATA strings 
Dim selectPrimaryColumns As String = 
<![CDATA[ 
    /* 
     My Report 
    */ 
    USE DatabaseName 

    SELECT col1 
     , col2 
]]>.Value 

selectColumnSetA 
<![CDATA[ 
     -- Column Set A 
     , col3 
     , col4 
]]>.Value 

selectColumnSetB 
<![CDATA[ 
     -- Column Set B 
     , col5 
     , col6 
]]>.Value 

Dim selectFilters As String = 
<![CDATA[ 
    FROM MyTable t 
     -- with many joins 

    WHERE t.Date BETWEEN @StartDate AND DATEADD(DAY, 1, @EndDAte) 
     -- and many more parameterized filters. 

]]>.Value 

' Set the first part of the query 
Dim fullQuery As String = selectPrimaryColumns 

' Conditionally add the various column sets 
SELECT CASE myParameter 
CASE "ColumnSetA" 
    fullQuery = fullQuery & selectColumnSetA 
CASE "ColumnSetB" 
    fullQuery = fullQuery & selectColumnSetB 

' Add the last part of the query 
fullQuery = fullQuery & selectFilters 

이제 SQL 명령 개체에 전달할 수있는 SQL 쿼리 문자열이 생겼습니다.

0

무게 후이 동적 SQL

DECLARE @AddColumns AS NVARCHAR(20) = 'Column Set 1' 
DECLARE @SQL VARCHAR(5000) 

SET @SQL = 'SELECT col1, col2 ' 
IF @AddColumns = 'Column Set 1' OR @AddColumns = 'Include All Columns' 
    SET @SQL = @SQL + ', col3, col4, col5, col6, col7 ' 
IF @AddColumns = 'Column Set 2' OR @AddColumns = 'Include All Columns' 
    SET @SQL = @SQL + ', col8, col9, col10 ' 
SET @SQL = @SQL + ',col11 FROM MyTable' 

EXEC (@SQL) 
+0

[sp_executesql] (http://msdn.microsoft.com/en-us/library/ms188001.aspx)을 호출하면 where 절에 매개 변수를 사용하여 인용, 이스케이프 및 SQL을 피할 수 있습니다. 주입 두통 –

관련 문제