2014-04-02 22 views
0

我想查詢數據,這將允許我使用SELECT語句帶入多個字段。下面是我的代碼:(它適用於一個特定領域 - [PDN005_Err]。我怎樣才能從只看005到PDN005 - PDN122,而不必硬編碼到那裏?SQL查詢幫助!使用選擇多個

任何幫助將大大讚賞

SELECT * 
FROM OpenQuery(INSQL, 
' 
SELECT [DateTime], [PDN005_Err], [PDN005_Loc] 
FROM Runtime.dbo.WideHistory 
WHERE [DateTime] >= ''2014-03-01'' 
AND [DateTime] <= ''2014-04-01'' 
AND [PDN005_Err] = 1 
ORDER BY [DateTime] 
' 
) 

我試圖查詢數據,這將允許我使用SELECT語句在多個領域帶來下面是我的代碼:。(對於一個特定領域的工作 - [PDN005_Err]如何從只看005到PDN005 - PDN122,而不必硬編碼到那裏?

任何幫助將大大appre ciated!

因此,作爲一個UPDATE這是我試過..

SELECT * 
FROM OpenQuery(INSQL, 
    ' 
SELECT [DateTime], [AGC005_ErrCond], [AGC003_ErrCond], [AGC005_Loc], [AGC003_Loc] 
FROM Runtime.dbo.WideHistory 
WHERE [DateTime] >= ''2014-03-01'' 
AND [DateTime] <= ''2014-04-01'' 
AND ([AGC005_ErrCond] = 1 
OR [AGC003_ErrCond] = 1) 
ORDER BY [DateTime] 
    ' 
) 

然而,當我收到的數據。我正在尋找的值是1 ..但是..數據將不斷重複本身,直到其中一個PDN錯誤= 1.這是附加的圖片,所以你可以看到。

+0

您可以在代碼中自動生成該查詢部分。 – Ashalynd

+1

對它們進行硬編碼有什麼不好? –

+0

我試圖對它們進行硬編碼,查詢無效,它會返回一個空白頁面。我一直在閱讀關於SQL查詢的內容,從我讀到的內容中,他們表示,在那裏硬編碼值效率不高(需要較長的時間來生成數據)。 此代碼返回空白頁 SELECT * FROM OPENQUERY(INSQL, ' SELECT [日期時間],[PDN005_Err],[PDN005_Loc],[PDN112_Err],[PDN112_Loc] FROM Runtime.dbo。WideHistory WHERE [DateTime]> =''2014-03-01'' AND [DateTime] <=''2014-04-01'' AND [PDN005_Err] = 1 AND [PDN112_Err] = 1 ORDER BY [日期時間] ' ) – swstrau118

回答

0

試試這個:

DECLARE @data varchar(max) 

;WITH x as 
(
    SELECT number FROM master..spt_values WHERE number between 1 and 122 and type = 'P' 
) 
SELECT @data = 'SELECT [DateTime]'+ ( 
     SELECT ',[PDN'+right(cast(number+1000 as char(4)), 3) + '_Err]' 
     FROM x 
     for xml path(''), type 
    ).value('.', 'varchar(max)') + ',[PDN005_Loc] 
FROM Runtime.dbo.WideHistory 
WHERE [DateTime] >= ''''2014-03-01'''' 
AND [DateTime] <= ''''2014-04-01'''' 
AND [PDN005_Err] = 1 
ORDER BY [DateTime]' 

exec('SELECT * 
FROM OpenQuery([INSQL],'''[email protected] + ''')') 

注意我會從@ThorstenKettner評論即硬編碼的列會更好同意。

您應該知道,OpenQuery中查詢varchar的最大長度是8 KB。

0

使用information_schema.colums查看,生成列清單

select column_name+',' from information_schema.colums 
where table_name='WideHistory' 
0

我建議以下辦法。首先聲明一個變量來保存列表。

declare @ColumnList as varchar(max) 

然後使用循環來填充它。

然後將其添加到另一個變量。

@EntireQuery = 'select * from openquery(
INDSQL, ''select etc ' + @ColumnList + 
' from etc '')' 

然後運行查詢:

exec sp_executesql @EntireQuery 

注意到,使用這種方法,你將需要更多的單引號比你現在。