Sql server TSQL从动态SQL写入临时表

Sql server TSQL从动态SQL写入临时表,sql-server,tsql,session,temp-tables,Sql Server,Tsql,Session,Temp Tables,考虑以下代码: SET @SQL1 = 'SELECT * INTO #temp WHERE ...' exec(@SQL1) SELECT * from #temp (this line throws an error that #temp doesn't exist) 显然,这是因为exec命令派生出一个单独的会话,而#temp是该会话的本地会话。我可以使用全局临时表###temp,但是我必须想出一个命名方案来避免冲突。你们都推荐什么?是否尝试显式创建模板表 Create Table #

考虑以下代码:

SET @SQL1 = 'SELECT * INTO #temp WHERE ...'
exec(@SQL1)
SELECT * from #temp  (this line throws an error that #temp doesn't exist)

显然,这是因为exec命令派生出一个单独的会话,而#temp是该会话的本地会话。我可以使用全局临时表###temp,但是我必须想出一个命名方案来避免冲突。你们都推荐什么?

是否尝试显式创建模板表

Create Table #temp (..)

您可以在exec之前创建temp,并使用exec填充temp表。

您不能在插入后使用;delimeter并同时运行这两个语句?

没有找到一个可行的解决方案,可以满足我的所有需求,因此我转而使用“全局临时表”。

试试“临时表” 因为您的动态查询是在其他光纤上执行的 因此,您无法看到其本地临时表。 相反,如果您将临时表声明为global,它将成为一个sens。

例如,请查看“into”


另一种方法是使用动态SQL中的所有代码

SET @SQL1 = 'SELECT * INTO #temp WHERE ...
SELECT * from #temp  ' 
exec(@SQL1) 

有一种方法可以使用单个标识列创建虚拟临时表,然后通过动态SQL使用所需的模式更改该表并填充它。这样,您就可以在动态SQL和常规SQL中使用临时表,并使用它

-- Create dummy table
CREATE TABLE #tmpContactData (PK int NOT NULL IDENTITY(1,1))

-- Alter its schema
DECLARE @sqlCommand nvarchar(max)
SELECT @sqlCommand = '
ALTER TABLE #tmpContactData
ADD 
    EmployeeId int,
    Address varchar(100),
    Phone varchar(50)
'
EXECUTE(@sqlCommand)

-- Fill it
SELECT @sqlCommand = '
INSERT INTO #tmpContactData
SELECT t.EmployeeId, t.Address, t.Phone 
FROM (  SELECT EmployeeId=1000, Address=''Address 1000'', Phone=''Phone 1000'' 
        UNION 
        SELECT 1001, ''Address 1001'', ''Phone 1001'' 
        UNION 
        SELECT 1002, ''Address 1002'', ''Phone 1002''
) t
'
EXECUTE(@sqlCommand)

--select from it
SELECT * FROM #tmpContactData

--CleanUp
DROP TABLE #tmpContactData

这确实解决了范围问题。但是,因为在执行exec语句之前,我不知道模式。(除非有办法在不定义模式的情况下创建表?)#告诉您正在使用tempdb,并自动解析为tempdb中具有大量旧随机名称的实际表,以防止冲突。发出create语句不需要架构名称,但应该在动态SQL之外执行。如何在不知道架构的情况下创建临时表?(我的select into定义了模式)它可能会导致多用户系统出现问题environment@Madhivanan什么问题?
-- Create dummy table
CREATE TABLE #tmpContactData (PK int NOT NULL IDENTITY(1,1))

-- Alter its schema
DECLARE @sqlCommand nvarchar(max)
SELECT @sqlCommand = '
ALTER TABLE #tmpContactData
ADD 
    EmployeeId int,
    Address varchar(100),
    Phone varchar(50)
'
EXECUTE(@sqlCommand)

-- Fill it
SELECT @sqlCommand = '
INSERT INTO #tmpContactData
SELECT t.EmployeeId, t.Address, t.Phone 
FROM (  SELECT EmployeeId=1000, Address=''Address 1000'', Phone=''Phone 1000'' 
        UNION 
        SELECT 1001, ''Address 1001'', ''Phone 1001'' 
        UNION 
        SELECT 1002, ''Address 1002'', ''Phone 1002''
) t
'
EXECUTE(@sqlCommand)

--select from it
SELECT * FROM #tmpContactData

--CleanUp
DROP TABLE #tmpContactData