1

我需要开发 ssrs 报告,其中用户将提供一个月 asvarchar(2)和 year as varchar(4)。当用户单击查看报告按钮时,ssrs 报告应显示如下结果。(假设用户通过月份为 12,年份为 2013)

Date                 TagName               Average
12/01/13             Tag01                   45.23
12/01/13             Tag02                   89.23
12/02/13             Tag01                   2.363
12/02/13             Tag02                   45.23
.
.
.
12/31/13             Tag01                   55.24
12/31/13             Tag02                   95.24

我设计了以下查询

CREATE TABLE #tempval 
  ( 
     [timestamp] VARCHAR(30), 
     tagname     VARCHAR(300), 
     tagval      DECIMAL(18, 5) 
  ) 

DECLARE @month VARCHAR(2) 
DECLARE @year VARCHAR(4) 

SET @month='08' 
SET @year='2014' 

DECLARE @startdate VARCHAR(30) 
DECLARE @enddate VARCHAR(30) 

SET @startdate=@month + '/01/' + @year 

IF ( CONVERT(INT, @month) >= Month(Getdate()) 
     AND CONVERT(INT, @year) >= Year(Getdate()) ) 
  BEGIN 
      SET @enddate=CONVERT(VARCHAR, (SELECT Getdate())) 
  END 
ELSE 
  BEGIN 
      SET @enddate=CONVERT(VARCHAR, Dateadd(day, -1, Dateadd(month, 1, CONVERT( 
                                                     DATETIME, @startdate 
                                                          )) 
                                    )) 
  END 

DECLARE @query VARCHAR(1000) 
DECLARE @starttime VARCHAR(30) 
DECLARE @endtime VARCHAR(30) 

SET @starttime= CONVERT(VARCHAR, Datepart(month, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT( 
                DATETIME, @startdate))))) 
                + '/' 
                + CONVERT(VARCHAR, Datepart(day, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT(DATETIME, @startdate))))) 
                + '/' 
                + CONVERT(VARCHAR, Datepart(year, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT(DATETIME, @startdate))))) 
                + ' ' 
                + CONVERT(VARCHAR, Datepart(hour, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT(DATETIME, @startdate))))) 
                + ':' 
                + CONVERT(VARCHAR, Datepart(minute, Dateadd(hour, 22, Dateadd( 
                day, -1, CONVERT(DATETIME, @startdate))))) 
                + ':' 
                + CONVERT(VARCHAR, Datepart(second, Dateadd(hour, 22, Dateadd( 
                day, -1, CONVERT(DATETIME, @startdate))))) 
SET @endtime=CONVERT(VARCHAR, Datepart(month, Dateadd(hour, 22, CONVERT(DATETIME 
             , @startdate) 
             ))) 
             + '/' 
             + CONVERT(VARCHAR, Datepart(day, Dateadd(hour, 22, CONVERT(DATETIME 
             , @startdate)))) 
             + '/' 
             + CONVERT(VARCHAR, Datepart(year, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
             + ' ' 
             + CONVERT(VARCHAR, Datepart(hour, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
             + ':' 
             + CONVERT(VARCHAR, Datepart(minute, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
             + ':' 
             + CONVERT(VARCHAR, Datepart(second, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
SET @query='select * from openquery(muri,''set StartTime=''''' 
           + @starttime + ''''',EndTime=''''' + @endtime 
           + 
''''' select * from ihrawdata where tagname=MURISERVER.MURI.DCS.ASSETS.87A.87A_FI_2101.DACA.PV  and samplingmode=rawbytime'')'

EXEC (@query) 

但它显示空白列,但我不知道为什么。

4

1 回答 1

0

我发现查询 GE Proficy Historian 的 SSRS 报告最简单的方法是在存储过程中使用动态 SQL。

先决条件是您拥有使用 IhOLEDB.iHistorian 提供程序配置的 SQL Server 链接服务器。安装后看起来像这样:

GE Historian 的链接服务器提供程序

然后你像往常一样创建一个存储过程,我通常有一个相当通用的过程,它接受你想要查询 GE Historian 的大部分参数。存储过程定义示例:

CREATE PROCEDURE [utility].[Historian_GetData] @DateFrom DATETIME,
                                           @DateTo DATETIME,
                                           @TagList  VARCHAR(1000),
                                           @Historian NVARCHAR(100),
                                           @SampleInterval NVARCHAR(50),
                                           @SampleMethod NVARCHAR(50),
                                           @DefaultRowCount INT = 5000

然而,为了使示例简单,这里是一个匿名块,其中包含一些将用于查询的日期。本质上,对于存储过程中的每个参数,您都可以将它们添加到动态 SQL 中。

DECLARE @DateFrom NVARCHAR(100) = '2018-05-02 06:00'
DECLARE @DateTo   NVARCHAR(100) = '2018-05-03 06:00'

DECLARE @SQL NVARCHAR(4000)
DECLARE @Result TABLE (TagName NVARCHAR(100) NOT NULL, [Timestamp] DATETIME NOT NULL, Value NVARCHAR(100) NOT NULL, Quality NVARCHAR(100) NOT NULL)

BEGIN
   SET @SQL = 'SELECT tagname, timestamp, value, quality
           FROM OPENQUERY ([Your-Historian],
           ''SET StartTime = "' + @DateFrom + '", EndTime = "' + @DateTo + '",
             SamplingMode = RawByTime
             SELECT tagname, timestamp, value, quality
             FROM ihRawData
             WHERE TagName = XYZ'')';

  INSERT INTO @Result EXEC sp_executesql @SQL

  SELECT TagName,
         [Timestamp],
         [Value],
         Quality
  FROM @Result ORDER BY TagName, [Timestamp]
END

结果将如下所示:

SQL 结果

总而言之:

  1. 将链接服务器配置为指向 Historian
  2. 创建接受所有 Historian 查询参数作为参数的存储过程。
  3. 执行你的动态 SQL
  4. 根据需要计算您的结果,在您的情况下是一些平均值。
于 2018-05-04T01:18:38.227 回答