2014-07-08 63 views
0

我需要添加或刪除基於variouse輸入參數的大約20列。我知道我可以在CASE語句中包裝每行,但是當我需要爲列集10添加10列時,這是大量額外的代碼。做一個動態的SQL怪物的答案是?如何根據輸入參數動態添加一組列?

這裏是什麼,我試圖做一個例子 - 回報5層特定的列時,最終用戶需要列集1:

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

稱重後動態SQL選項,ExecuteSql,在VB中構建SQL字符串,或者編輯生成的VB數據集我在VB中動態構建SQL字符串。我正在尋找一種'簡單'的方法來在SQL中完成這項工作。雖然可以在SQL中完成,但在VB中對我來說是「更清潔」的。 (對不起,我應該提到在原始問題中VB正在使用這個查詢。)想象一下,許多列集合每個集合添加大概5-10列,多個連接,參數化過濾器等。我在這裏做什麼,如果構建各種SQL查詢部分,並根據輸入參數將它們附加在一起。

' 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 Command對象。

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注射頭痛 –

相關問題