我可以对从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'
有了这个,我得到了这张表:
存储在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
答案 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'
然后你可以在那个表上使用查询