SQL Server 存储过程创建临时表并插入值
Posted
技术标签:
【中文标题】SQL Server 存储过程创建临时表并插入值【英文标题】:SQL Server stored procedure creating temp table and inserting value 【发布时间】:2013-01-15 08:52:04 【问题描述】:我正在尝试从不同的表中选择值并将其插入到临时表中。
我需要临时表中的标识字段。当我尝试执行以下代码时,它会引发错误:
*消息 2714,级别 16,状态 1,过程 SelectCashDetails,第 27 行 数据库中已经有一个名为“#ivmy_cash_temp1”的对象。*
我尝试将临时表更改为不同的名称,即使它引发了相同的错误。
这是我的代码:
ALTER PROCEDURE [dbo].[SelectCashDetails]
(
@trustcompanyid BigInt,
@trustaccountid BigInt,
@planid BigInt,
@fromdate varchar(20),
@todate varchar(20),
@movetype varchar(20),
@typedesc varchar(20)
)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
CREATE TABLE #ivmy_cash_temp1
( tmovedate datetime,
tmovedesc varchar(20),
tmoneymovetype varchar(20),
tplanbal decimal(18,6),
tsourcetype BigInt,
tdestinationtype BigInt)
SELECT
IDENTITY(int) AS id,
CMM.movedate,
CDCP.paramdesc,
CMM.movementtypecd,
CMM.amountmoved,
CMM.planbalance,
cmm.sourceaccounttypeid,
cmm.destinationaccounttypeid
into #ivmy_cash_temp1
from
cash_moneymove CMM
inner join
CDC_PARAMETERS CDCP on CMM.movedescriptioncd=CDCP.paramcd
where
CMM.movedescriptioncd = @typedesc
and PARAMNAME = 'Cash AccountType Desc'
select * from #ivmy_cash_temp1
END
【问题讨论】:
你在一个事务中多次调用它? 临时表使用后不需要删除吗?即在存储过程结束时? 您不需要在过程结束时删除临时表。 【参考方案1】:SELECT INTO
语句为您创建表。无需事先声明CREATE TABLE
。
发生的事情是您在 CREATE
语句中创建 #ivmy_cash_temp1
,然后当您执行 SELECT INTO
时,数据库会尝试为您创建它。这会导致错误,因为它正在尝试创建您已经创建的表。
要么消除CREATE TABLE
语句,要么更改填充它的查询以使用INSERT INTO SELECT
格式。
如果您需要在新行中添加唯一 ID,那么最好使用 SELECT INTO
...,因为 IDENTITY()
仅适用于这种语法。
【讨论】:
嗨,戴夫,我必须在表格的帮助下逐行进行操作......请给我一些建议...... 而不是执行 SELECT IDENTITY( int ) AS id,CMM.movedate,.... INTO #ivmy_cash_temp1 等... 用数据填充表格。使用 INSERT INTO #ivmy_cash_temp1 SELECT IDENTITY( int ) AS id,CMM.movedate,.... FROM 等。 谢谢你,我明白了......但是在我从临时表中选择了值之后,它没有显示任何值............ 不显示任何行?还是没有为您的 ID 列显示任何值? 废掉我之前的评论。 SELECT IDENTITY() 仅在使用 SELECT INTO 语法时有效。所以删除 CREATE TABLE 语句,只使用 SELECT INTO。以上是关于SQL Server 存储过程创建临时表并插入值的主要内容,如果未能解决你的问题,请参考以下文章