2016-12-07 2 views
0

Kann ich Operationen (SUM, AVG usw.) für eine Tabelle ausführen, die von einer gespeicherten Prozedur in T-SQL zurückgegeben wird?Operationen über eine Stored Procedure-Tabelle SQL

Hier meine SP-Code:

exec CC_SP_ReadTags 
    '11', '2016-12-07 00:00:00', '2016-12-07 23:00:00','','Timestamp ASC','TIMESTEP=60,2' 

Damit erhalte ich diese Tabelle:

enter image description here

Die im Bereich Realvalue gespeicherten Daten sind varchar und ich möchte die AVG tun auf sie, ist es irgendwie möglich? Ich habe alle diese Befehle versucht, aber ohne Erfolg:

select AVG(RealValue) 

SELECT CAST(RealValue AS INT) 

SELECT CONVERT(INT, RealValue) 

Jede Hilfe ist willkommen danke Ihnen allen.

Hier ist der SP-Code:

USE CC_SIR_16_07_29_11_30_35R 
GO 
SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER OFF 
GO 


CREATE PROCEDURE [dbo].[CC_SP_ReadTags] 
(
    @List varchar(1000), 
    @TimeBegin varchar(32), 
    @TimeEnd varchar(32), 
    @WHEREClause varchar(1000)= NULL, 
    @ORDERBYClause varchar(1000) = NULL, 
    @Timestep varchar(500) = NULL, 
    @Aggregationmode int = 0, 
    @SymDataSource varchar(512) = NULL, 
    @SymCatalog varchar(512) = NULL, 
    @LS_Name varchar(255)=NULL 
) 
WITH encryption 
AS 
BEGIN 
    SET NOCOUNT ON 
    --DECLARE @LS_Name varchar(255) 
    DECLARE @Catalogname varchar(255) 
    DECLARE @Internal_LS bit 
    DECLARE @NoTime bit 
    SET @Internal_LS = 0 

    -- check valid datetime or Aggregationmode = 0 
    DECLARE @ret int 
    SET @ret = ISDATE(@TimeBegin) 
    IF (@ret = 0 and @Aggregationmode <> 0) 
     RETURN 

    IF ISNULL(@LS_Name,'') = '' 
    BEGIN 
     SET @LS_Name = 'CA_'+ CAST(@@SPID as varchar(10)) 
     SET @Catalogname = DB_NAME() 
     if @SymDataSource = NULL 
      set @SymDataSource = 'Hallo' 
     if ISNULL(@SymDataSource,'') = '' or ISNULL(@SymCatalog,'') = '' 
     BEGIN 
      EXEC sp_addlinkedserver @server = @LS_Name,@srvproduct = 'CommonArchiving', @provider = 'WinCCOLEDBProvider', @datasrc = @@servername, @catalog = @CatalogName 
      set @Internal_LS = 1 
     END 
     ELSE 
     BEGIN 
      EXEC sp_addlinkedserver @server = @LS_Name,@srvproduct = 'CommonArchiving', @provider = 'WinCCOLEDBProvider', @datasrc = @SymDataSource, @catalog = @SymCatalog 
      set @Internal_LS = 1 
     END 
    END 

    DECLARE @Statement varchar(8000) 
    SET @Statement = '' 

    SET @Statement = 'SELECT * FROM OPENQUERY('[email protected]_Name+',''Tag:R,('[email protected]+'),'''''[email protected]+''''','''''[email protected]+'''''' 

    IF(LEN(@TimeStep) <> 0) 
    BEGIN 
    SET @Statement = @Statement + ',' + @Timestep + ',' + CAST(@Aggregationmode AS VARCHAR(6)) 
    END 

    SET @Statement = @Statement + ' '') ' 

    IF(LEN(@WHEREClause) <> 0) 
    BEGIN 
     SET @Statement = @Statement + @WHEREClause 
    END 

    IF(LEN(@ORDERBYClause) <> 0) 
    BEGIN 
     SET @Statement = @Statement + ' ORDER BY ' + @ORDERBYClause 
    END 

    --print @Statement 

    BEGIN 
     EXEC(@Statement) 
    END 

    if @Internal_LS = 1 
    BEGIN 
     EXEC sp_dropserver @server = @LS_Name 
     set @LS_Name = NULL 
    END 
    SET NOCOUNT OFF 
END 

GO 
+0

Warum willst du ein 'Int'? Möchten Sie in diesem Fall nicht "Dezimal" verwenden? – christiandev

+0

Ja auch Dezimal ist in Ordnung, aber es funktioniert nicht –

+0

Ich habe Ihnen ein Beispiel mit Dezimal angegeben. – christiandev

Antwort

0

einen Blick auf dieses Beispiel nehmen ...

DECLARE @tbl TABLE (RealValue NVARCHAR(50)) 
INSERT @tbl 
     (RealValue) 
VALUES (N'0'), (N'15.321'), (N'9.854') 

SELECT AVG(CAST(RealValue AS DECIMAL(18,8))) FROM @tbl 

Sie erhalten eine Temp Tabelle aus der gespeicherten Prozedur füllen müssen, und dann werfen Sie die RealValue vor dem Aufruf AVG.

INSERT INTO #Temp_CC_SP_ReadTags 
exec CC_SP_ReadTags 
    '11', '2016-12-07 00:00:00', '2016-12-07 23:00:00','','Timestamp ASC','TIMESTEP=60,2' 

SELECT AVG(CAST(RealValue AS DECIMAL(18,13))) FROM #Temp_CC_SP_ReadTags 

Offensichtlich setzen die Dezimalstelle auf die precision and scale Sie benötigen.

Präzision ist die Anzahl der Ziffern in einer Zahl. Maßstab ist die Anzahl der Ziffern rechts von dem Dezimalpunkt in einer Zahl. Zum Beispiel hat die Nummer 123.45 eine Genauigkeit von 5 und eine Skala von 2.

+0

Ich benutze Ihr Beispiel, aber ich habe diesen Fehler bereits: Kann keinen expliziten Wert in eine Timestamp-Spalte einfügen. Verwenden Sie INSERT mit einer Spaltenliste, um die Timestamp-Spalte auszuschließen, oder fügen Sie DEFAULT in die Timestamp-Spalte ein. –

+0

Bauen Sie die temporäre Tabelle mit 'DateStamp'? Wenn ja, ändern Sie das in "DateTime" – christiandev

+0

Ich baue die temporäre Tabelle mit TimeStamp, wenn ich versuche mit DateTime funktioniert nicht –

0

Sie Tabelle von gespeicherten Prozedur in temporäre Tabelle

create table #temp(
    ValueId int, 
    [Timestamp] timestamp, 
    Realvalue varchar(250), 
    quality int, 
    flags int 
    ) 
    insert into #temp 
    exec CC_SP_ReadTags 
    '11', '2016-12-07 00:00:00', '2016-12-07 23:00:00','','Timestamp  ASC','TIMESTEP=60,2' 

dann können Sie Abfrage auf diese Tabelle zurück speichern