【问题标题】:SQL Server stored procedure creating temp table and inserting valueSQL Server 存储过程创建临时表并插入值
【发布时间】: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

【问题讨论】:

  • 你在一个事务中多次调用它?
  • 临时表使用后不需要删除吗?即在存储过程结束时?
  • 您不需要在过程结束时删除临时表。

标签: sql-server sql-server-2005 stored-procedures


【解决方案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。
猜你喜欢
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2023-04-03
相关资源
最近更新 更多