我写了下面的存储过程。我需要创建两个临时表。 在第一个临时表上我使用游标使用id,然后基于某些查询需要在第二个临时表中插入。但我得到以下错误。 。 在这种情况下我需要一些帮助
数据库中已有一个名为“TempTable”的对象。
ALTER PROCEDURE [dbo].[GetDocumentByTrackID]
@idList nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TrackId INT
- 临时表1
CREATE TABLE TempTable(
ID INT
)
DECLARE @GetNextRecord cursor
INSERT INTO TempTable SELECT Value from dbo.fn_sqllist_to_table(@idList,';')
- 临时表2
Create TABLE TracksNameID
(
ID INT,
Name nvarchar(100)
)
SET @GetNextRecord = cursor for select ID from TempTable
open @GetNextRecord
FETCH FROM @GetNextRecord into @TrackId
while @@FETCH_STATUS = 0
BEGIN
INSERT INTO TracksNameID
SELECT ID ,Name FROM dbo.TestTable
WHERE dbo.TestTable.TrackID = @TrackId
END
FETCH FROM @GetNextRecord into @TrackId
DROP TABLE TempTable
END
答案 0 :(得分:2)
这些实际上不是临时表,而是创建真正的表对象。如果存储过程在某处失败,则不会删除表。更好地坚持使用表变量:
DECLARE @tableName TABLE (
id int, ... )
并像表一样使用@tableName
(它是)。这样,所有内容都将绑定到存储过程的本地范围。
表变量相对于临时表的缺点是缺少聚簇索引而你不能ALTER
表变量。
答案 1 :(得分:1)
您创建常规表,临时表名称应以#
开头尝试创建#TempTable和#TracksNameID