【问题标题】:Check data from SELECT and then INSERT new values检查来自 SELECT 的数据,然后插入新值
【发布时间】:2015-02-03 17:50:05
【问题描述】:

所以,我有一些数据表,我需要根据旧数据获取一个包含新数据的新表,然后将它们插入到临时表中以进行下一次处理。

但是我的 SQL 出了点问题

DECLARE @PGNPGE float,
            @PGHTTP400PCT float,
            @PGHTTP500PCT float,
            @PGSLPCT float,
            @PGTME float;

    DECLARE @tempTable TABLE (
        PViews int, 
        Http400 int, 
        Http500 int, 
        PTime int, 
        ExclSimul int, 
        DispSimul int, 
        SlowPages int, 
        AESWA int
    );

    IF EXISTS (SELECT COUNT(*) FROM [ApplicationThreshold] WHERE [ApplicationID] = @AppID)
    BEGIN
        SELECT @PGNPGE = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 6;
        SELECT @PGHTTP400PCT = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 31;
        SELECT @PGHTTP500PCT = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 12;
        SELECT @PGSLPCT = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 49;
        SELECT @PGTME = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 72;
    END
    ELSE
    BEGIN
        SELECT @PGNPGE = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 6;
        SELECT @PGHTTP400PCT = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 31;
        SELECT @PGHTTP500PCT = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 12;
        SELECT @PGSLPCT = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 49;
        SELECT @PGTME = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 72;
    END

    INSERT INTO @tempTable (
        PViews, 
        Http400, 
        Http500, 
        PTime, 
        ExclSimul, 
        DispSimul, 
        SlowPages, 
        AESWA )
    SELECT 
        [PViews] = CASE WHEN sel.[PGNPGE] < @PGNPGE THEN 1 ELSE 0 END,
        [Http400] = CASE WHEN sel.[PGHTTP400PCT] > @PGHTTP400PCT THEN 1 ELSE 0 END, 
        [Http500] = CASE WHEN sel.[PGHTTP500PCT] > @PGHTTP500PCT THEN 1 ELSE 0 END, 
        [PTime] = CASE WHEN sel.[PGTME] > @PGTME THEN 1 ELSE 0 END, 
        [ExclSimul] = CASE WHEN ([PViews] + [Http400] + [Http500] + [PTime]) >= 1 THEN 1 ELSE 0 END, 
        [DispSimul] = CASE WHEN ([PViews] + [Http400] + [Http500] + [PTime]) > 1 THEN ([PViews] + [Http400] + [Http500] + [PTime]) ELSE 0 END, 
        [SlowPages] = CASE WHEN sel.[PGSLPCT] > @PGSLPCT THEN 1 ELSE 0 END, 
        [AESWA] = CASE WHEN [ExclSimul] >=1  THEN 0 ELSE [SlowPages] END
    FROM (SELECT [PGNPGE], [PGHTTP400PCT], [PGHTTP500PCT], [PGSLPCT], [PGTME]
            FROM [dbo].[TimeValue]
            WHERE [ApplicationID] = @AppID
            AND [Time] BETWEEN @DateFrom AND @DateTo) sel;

SELECT * FROM @tempTable;

以及我添加新值的错误

消息 207,第 16 层,状态 1,第 59 行
列名“PViews”无效。

消息 207,第 16 层,状态 1,第 59 行
列名“Http400”无效。

消息 207,第 16 层,状态 1,第 59 行
列名“Http500”无效。

消息 207,第 16 层,状态 1,第 59 行
列名“PTime”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“PViews”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“Http400”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“Http500”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“PTime”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“PViews”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“Http400”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“Http500”无效。

消息 207,第 16 层,状态 1,第 60 行
列名“PTime”无效。

消息 207,第 16 层,状态 1,第 62 行
列名“ExclSimul”无效。

消息 207,第 16 层,状态 1,第 62 行
列名“SlowPages”无效。

【问题讨论】:

  • 您不能在定义表的同一select 中引用表别名。如果您愿意,可以使用子查询,或者只是重复表达式。
  • 我认为有可能以某种方式绕过
  • 是的。这只是分配别名的另一种方式。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

尝试使用 CTE 在表变量中插入数据:

declare @PGNPGE float,
    @PGHTTP400PCT float,
    @PGHTTP500PCT float,
    @PGSLPCT float,
    @PGTME float;

declare @tempTable TABLE 
(
    PViews int, 
    Http400 int, 
    Http500 int, 
    PTime int, 
    ExclSimul int, 
    DispSimul int, 
    SlowPages int, 
    AESWA int
);

IF EXISTS (SELECT COUNT(*) FROM [ApplicationThreshold] WHERE [ApplicationID] = @AppID)
BEGIN
    SELECT @PGNPGE = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 6;
    SELECT @PGHTTP400PCT = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 31;
    SELECT @PGHTTP500PCT = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 12;
    SELECT @PGSLPCT = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 49;
    SELECT @PGTME = Value FROM [ApplicationThreshold] WHERE [ThresholdID] = 72;
END
ELSE
BEGIN
    SELECT @PGNPGE = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 6;
    SELECT @PGHTTP400PCT = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 31;
    SELECT @PGHTTP500PCT = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 12;
    SELECT @PGSLPCT = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 49;
    SELECT @PGTME = Value FROM [ApplicationTypeThreshold] WHERE [ThresholdID] = 72;
END

;with ThresholdCTE
as
(
    SELECT 
        case when sel.[PGNPGE] < @PGNPGE then 1 else 0 end as [PViews],
        case when sel.[PGHTTP400PCT] > @PGHTTP400PCT then 1 else 0 end as [Http400], 
        case when sel.[PGHTTP500PCT] > @PGHTTP500PCT then 1 else 0 end as [Http500], 
        case when sel.[PGTME] > @PGTME then 1 else 0 end as [PTime], 
        case when ([PViews] + [Http400] + [Http500] + [PTime]) >= 1 then 1  else 0 end as [ExclSimul], 
        case when ([PViews] + [Http400] + [Http500] + [PTime]) > 1 then ([PViews] + [Http400] + [Http500] + [PTime]) else 0 end as [DispSimul], 
        case when sel.[PGSLPCT] > @PGSLPCT then 1 else 0 end as [SlowPages], 
        case when [ExclSimul] >=1 then 0 else [SlowPages] end as [AESWA]
    from [dbo].[TimeValue]
    where [ApplicationID] = @AppID
          and [Time] between @DateFrom and @DateTo
)

insert into @tempTable 
(
    PViews, 
    Http400, 
    Http500, 
    PTime, 
    ExclSimul, 
    DispSimul, 
    SlowPages, 
    AESWA 
)
select
    PViews, 
    Http400, 
    Http500, 
    PTime, 
    ExclSimul, 
    DispSimul, 
    SlowPages, 
    AESWA 
from [ThresholdCTE]


SELECT * FROM @tempTable;

【讨论】:

  • 列名“PViews”无效,否则
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 2014-01-04
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多