对存储过程表SQL的操作

时间:2016-12-07 09:47:28

标签: sql sql-server tsql stored-procedures

我可以对从T-SQL中的存储过程返回的表执行操作(SUM,AVG等)吗?

这是我的SP代码:

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

有了这个,我得到了这张表:

enter image description here

存储在RealValue字段中的数据是varchar,我想对它们进行AVG,是否可能以某种方式? 我已经尝试了所有这些命令但没有成功:

select AVG(RealValue)

SELECT CAST(RealValue AS INT)

SELECT CONVERT(INT, RealValue)

感谢所有人的帮助。

这是SP代码:

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('+@LS_Name+',''Tag:R,('+@List+'),'''''+@TimeBegin+''''','''''+@TimeEnd+''''''

    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

2 个答案:

答案 0 :(得分:0)

看看这个例子......

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

您需要从存储过程中填充 temp 表,然后在调用RealValue之前强制转换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

显然,将小数设置为您需要的precision and scale

  

精确度是数字中的位数。比例是数量   数字小数点右边的数字。例如,   数字123.45的精度为5,比例为2。

答案 1 :(得分:0)

您可以将存储过程返回的表存储到临时表

    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'

然后你可以在那个表上使用查询

相关问题