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?该代码不是您尚未指定要在其中插入数据的表,并且由于您正在应用选择查询的表是空的,因此它不会返回任何结果。 如果你想使用
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。