Tsql 在一个存储过程中创建两个临时表时是否存在问题

Tsql 在一个存储过程中创建两个临时表时是否存在问题,tsql,Tsql,我已经写了下面的存储过程。我需要在其中创建两个临时表。 在第一个临时表上,我使用游标获取id,然后根据一些查询需要插入到第二个临时表中。但是我得到了下面的错误。 在这种情况下我需要一些帮助 数据库中已经有一个名为“诱惑”的对象 -临时表1 CREATE TABLE TempTable( ID INT ) DECLARE @GetNextRecord cursor INSERT INTO TempTable SELECT Value from dbo.fn_sqllist_to_table(@i

我已经写了下面的存储过程。我需要在其中创建两个临时表。 在第一个临时表上,我使用游标获取id,然后根据一些查询需要插入到第二个临时表中。但是我得到了下面的错误。 在这种情况下我需要一些帮助

数据库中已经有一个名为“诱惑”的对象

-临时表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

创建常规表时,临时表名称应以


尝试创建可诱惑的TracksNameID

创建常规表时,临时表名称应以

尝试创建诱惑和TracksNameID

这些实际上不是临时表,而是创建真正的表对象。如果存储过程在某个地方失败,则不会删除这些表。最好坚持使用表变量:

DECLARE @tableName TABLE (
  id int, ... )
使用@tableName,就像使用表一样。这样,所有内容都将绑定到存储过程的本地范围

与临时表相比,表变量的缺点是缺少聚集索引,并且您无法更改表变量。

这些不是真正的临时表,您正在创建真正的表对象。如果存储过程在某个地方失败,则不会删除这些表。最好坚持使用表变量:

DECLARE @tableName TABLE (
  id int, ... )
使用@tableName,就像使用表一样。这样,所有内容都将绑定到存储过程的本地范围



与临时表相比,表变量的缺点是缺少聚集索引,并且不能更改表变量。

这不是临时表。为什么要用光标来插入?哦,是的,我弄错了。使用游标,我通过运行查询在第二个表中插入值。这就是我们的想法。您应该能够在TracksNameID中插入SELECT ID,Name FROM dbo.TestTable t JOIN dbo.fn\u sqllist\u to_table@idList,';' f ON t.TrackID=f.Value,不再需要临时表或游标。非常感谢Martin。但我的实际查询是dbo.Documents\u CheckList.ID,dbo.Documents\u CheckList.Name FROM dbo.Documents\u CheckList内部连接dbo.Documents\u CheckList\u设置dbo.Documents\u CheckList.ID=dbo。Documents\u CheckList\u Setting.DocID,其中dbo.Documents\u CheckList\u Setting.TrackID=@TrackID这不是临时表。为什么要用光标来插入?哦,是的,我弄错了。使用游标,我通过运行查询在第二个表中插入值。这就是我们的想法。您应该能够在TracksNameID中插入SELECT ID,Name FROM dbo.TestTable t JOIN dbo.fn\u sqllist\u to_table@idList,';' f ON t.TrackID=f.Value,不再需要临时表或游标。非常感谢Martin。但我的实际查询是dbo.Documents\u CheckList.ID,dbo.Documents\u CheckList.Name FROM dbo.Documents\u CheckList内部连接dbo.Documents\u CheckList\u设置dbo.Documents\u CheckList.ID=dbo。Documents\u CheckList\u Setting.DocID其中dbo.Documents\u CheckList\u Setting.TrackID=@TrackIdOhh!!我犯了那个错误。但即使这是一张普通的桌子。这是否意味着我只能创建一个表?否,表名在数据库中必须是唯一的。否则,如果表名在数据库中存在多次,则无法解析涉及表的语句。但是,只要数据库中不存在表,就可以创建任意数量的表。这同样适用于临时表和表变量。表变量可以具有聚集的可索引变量不能具有统计信息!哎哟,当然,但他们不能有一个非聚集索引:-如果不是主键或唯一约束的副作用的话!!我犯了那个错误。但即使这是一张普通的桌子。这是否意味着我只能创建一个表?否,表名在数据库中必须是唯一的。否则,如果表名在数据库中存在多次,则无法解析涉及表的语句。但是,只要数据库中不存在表,就可以创建任意数量的表。这同样适用于临时表和表变量。表变量可以具有聚集的可索引变量不能具有统计信息!哎哟,当然,但它们不能有非聚集索引:-若不是主键或唯一约束的副作用的话