sql存储过程,select into

Posted

技术标签:

【中文标题】sql存储过程,select into【英文标题】:sql stored procedure, select into 【发布时间】:2018-03-22 07:13:07 【问题描述】:

我尝试构建一个将数据插入表的存储过程, 运行后,表为空。

这是代码:

CREATE TABLE invoices
(invoiceNo int,
 invoiceDate date,
 invoiceTotal int,
 invoiceType char(1))


alter PROCEDURE Invoices_AGG
@year int

AS
    select
    (case when MONTH(invoiceDate) >9 then concat('01','/',MONTH(invoiceDate),'/',year(invoiceDate)) else concat('01','/0',MONTH(invoiceDate),'/',year(invoiceDate)) end) as DateID,
    SUM(case when invoiceType = 'B' then invoiceTotal else 0 end) as Total_Incomes_TypeB,
    SUM(case when invoiceType = 'I' then invoiceTotal else 0 end) as Total_Incomes_TypeI
    into FACT_Invoices_AGG 
    from invoices
    where year(invoiceDate)=@year
    group by (case when MONTH(invoiceDate) >9 then concat('01','/',MONTH(invoiceDate),'/',year(invoiceDate)) else concat('01','/0',MONTH(invoiceDate),'/',year(invoiceDate)) end);


exec Invoices_AGG 2013

谢谢

【问题讨论】:

您使用的是哪个 dbms?该代码是特定于产品的。 我创建的dbms 代码是正规的,根据dbms 我们需要知道您使用的是哪个数据库,是 SQL Server、Oracle 还是 mysql?请相应地标记。 @JOE,哪个 dbms?该代码不是 标签所用的 ANSI SQL。 【参考方案1】:

您尚未指定要在其中插入数据的表,并且由于您正在应用选择查询的表是空的,因此它不会返回任何结果。 如果你想使用

into

您还应该提及FACT_Invoices_AGG 函数的代码。

【讨论】:

你说的是什么功能? FACT_Invoices_AGG 是 OP 的 SELECT...INTO 语句的目标表。【参考方案2】:

SELECT INTO 语句创建一个表并用数据填充它。执行 2 次或更多次该语句将失败(因为表将在第一次运行时创建,并会在第二次运行时再次尝试创建它)。

如果表是空的,要么是因为查询没有返回结果,要么是 SP 由于我之前提到的原因而失败(或者甚至在构建结果时失败,例如转换错误)。使用SELECT INTO 时,请务必先删除表IF EXISTS(如果这是您想要的)。

ALTER PROCEDURE Invoices_AGG
@year int

AS
BEGIN

    IF EXISTS( SELECT 'table exists' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'FACT_Invoices_AGG'AND TABLE_SCHEMA = 'dbo')
        DROP TABLE dbo.FACT_Invoices_AGG

    select
        (case when MONTH(invoiceDate) >9 then concat('01','/',MONTH(invoiceDate),'/',year(invoiceDate)) else concat('01','/0',MONTH(invoiceDate),'/',year(invoiceDate)) end) as DateID,
        SUM(case when invoiceType = 'B' then invoiceTotal else 0 end) as Total_Incomes_TypeB,
        SUM(case when invoiceType = 'I' then invoiceTotal else 0 end) as Total_Incomes_TypeI
    into 
        FACT_Invoices_AGG 
    from 
        invoices
    where 
        year(invoiceDate)=@year
    group by 
        (case when MONTH(invoiceDate) >9 then concat('01','/',MONTH(invoiceDate),'/',year(invoiceDate)) else concat('01','/0',MONTH(invoiceDate),'/',year(invoiceDate)) end);

END
GO

另一种选择是将您的SELECT INTO 更改为INSERT INTO (columnNames, ...) SELECT,这要求该表事先存在。

尝试在没有INTO 的情况下执行SELECT,看看它在计算结果时是否不会失败。如果不存在,则在使用 SELECT INTO 之前确保目标表不存在。

【讨论】:

以上是关于sql存储过程,select into的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql存储过程select into temp table。

oracle存储过程select语句必须带into吗

关于oracle存储过程select into 未找到数据问题

存储过程里面set赋值怎么没有起到作用

如何解决oracle存储过程select into问题

关于oracle存储过程select into 未找到数据问题