我正在尝试查询允许我使用SELECT语句引入多个字段的数据。下面是我的代码:(适用于一个特定字段 - [PDN005_Err]。如何从仅查看005到PDN005-PDN122,而不必将其硬编码到那里?
非常感谢任何帮助!
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,而不必将其硬编码到那里?
非常感谢任何帮助!
所以作为更新,这是我试过的..
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 Err = 1.这里附有数据图片所以你可以看到。
答案 0 :(得分:0)
使用information_schema.colums视图生成列列表
select column_name+',' from information_schema.colums
where table_name='WideHistory'
答案 1 :(得分:0)
我建议采用以下方法。首先声明一个变量来保存列列表。
declare @ColumnList as varchar(max)
然后使用循环填充它。
然后将其添加到另一个变量。
@EntireQuery = 'select * from openquery(
INDSQL, ''select etc ' + @ColumnList +
' from etc '')'
然后运行您的查询:
exec sp_executesql @EntireQuery
请注意,使用这种方法,您需要比现在更多的单引号。
答案 2 :(得分: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],'''+@data + ''')')
注意我同意@ThorstenKettner的评论,即对列进行硬编码会更好。
您应该知道OpenQuery中查询varchar的最大长度是8 KB。