SQL Server 2014中的临时表导致';已经有一个名为';错误

SQL Server 2014中的临时表导致';已经有一个名为';错误,sql,sql-server,temporary,global-temp-tables,Sql,Sql Server,Temporary,Global Temp Tables,我在SQL Server中遇到以下问题,我有一些代码如下所示: IF OBJECT_ID('tempdb..##TempLog') IS NULL CREATE TABLE ##TempLog(id INT, name NVARCHAR(max)); INSERT INTO ##TempLog (id, name) VALUES (1, 'Test') 当我这样做时,我会得到一个错误 数据库中已存在名为“##TempLog”的对象 在SQL Server 2014中,但在SQL S

我在SQL Server中遇到以下问题,我有一些代码如下所示:

IF OBJECT_ID('tempdb..##TempLog') IS NULL
    CREATE TABLE ##TempLog(id INT, name NVARCHAR(max));

INSERT INTO ##TempLog (id, name) 
VALUES (1, 'Test')
当我这样做时,我会得到一个错误

数据库中已存在名为“##TempLog”的对象

在SQL Server 2014中,但在SQL Server 2016中,一切正常

这将起作用:

IF OBJECT_ID('tempdb..##TempLog') IS NOT NULL
drop table ##TempLog
CREATE TABLE ##TempLog(id INT, name NVARCHAR(10));

INSERT INTO ##TempLog (id, name) 
VALUES (1, 'Test')
as@Nick.McDermaid说你也应该替换NVARCHAR

但它也将在sql2012上起作用:

试试这个

DROP TABLE IF EXISTS tempdb.dbo.##TempLog
CREATE TABLE ##TempLog
  (
   id INT, 
   name NVARCHAR(10)
  )
如果要使用现有表,请使用

IF OBJECT_ID('tempdb..##TempLog') IS NOT NULL
    Truncate TABLE #TempLog
else
    CREATE TABLE ##TempLog
    (
        id INT, 
        name NVARCHAR(10)
    )

第一次运行时,我得到的字符串或二进制数据将被截断。。在我向nvarchar添加了一个大小来解决这个问题,并删除了有故障的表之后,我可以一遍又一遍地运行它而不会出现问题。您对nvarchar的错误使我怀疑这不是您的真实代码。@Nick.McDermaid谢谢您的临时表是否需要对其他进程/用户可见?如果没有,那么您应该只使用一个
,而不是
。单个
#
意味着每个进程都可以有自己的临时表。如果多个用户运行同一进程,则每个用户都有自己的临时表<代码>##表示临时表对所有用户都可见。如果使用
##
,则运行它的第一个用户将创建临时表。第二个用户将得到一个错误。如果第二个用户删除
##
临时表,第一个用户可能会受到负面影响
##
还表示临时表在用户进程结束后仍然存在。您是否复制了我的脚本并在tempb数据库上运行了它?因为在我的sql上,它可以毫无问题地工作,我也有sql 2016!我已经对它进行了测试,它也将对sql2012起作用,请参见我编辑的答案。