exec查询数据上下文的位置?

时间:2012-01-26 20:37:54

标签: sql sql-server sql-server-2008

我在sql server上使用exec(“query_string”)命令。问题是这个命令执行的更改在外面看不到。

我的意思是,我尝试在exec命令中创建一个带有动态列的临时表,它运行正常,但是当我尝试在创建的表上创建一个select语句时,我收到一条错误消息,表明该表没有存在。

我知道这是一个上下文问题,我的猜测是我如何使exec命令在同一个上下文中运行,就像其他sql语句一样???

CREATE TABLE #Test ( TheDate datetime, Harvest int )
INSERT INTO #Test(TheDate, Harvest) VALUES ('2011/10/11', 50)
INSERT INTO #Test(TheDate, Harvest) VALUES ('2012/10/11', 100)
INSERT INTO #Test(TheDate, Harvest) VALUES ('2011/10/01', 20)
INSERT INTO #Test(TheDate, Harvest) VALUES ('2011/12/11', 50)
INSERT INTO #Test(TheDate, Harvest) VALUES ('2011/11/11', 50)
INSERT INTO #Test(TheDate, Harvest) VALUES ('2011/11/12', 150)

DECLARE @listCol2 varchar(max)
SET @listCol2 = 
    (SELECT DISTINCT ('[' + CONVERT(varchar,YEAR(TheDate)) + '-' + RIGHT('0'+CONVERT(varchar,MONTH(TheDate)),2) +'] date,')
     FROM #Test
     ORDER BY ('[' + CONVERT(varchar,YEAR(TheDate)) + '-' + RIGHT('0'+CONVERT(varchar,MONTH(TheDate)),2) +'] date,') ASC
     FOR XML PATH(''))
SET  @listCol2 = LEFT(@listCol2,LEN(@listCol2)-1)
SELECT  @listCol2

EXEC ('CREATE TABLE #Test2 ('+@listCol2+')') 

SELECT * FROM #Test2 --In this line I got this message: the name of the object #Test2 isn't valid, why???

DROP TABLE #Test2

DROP TABLE #Test

由于

3 个答案:

答案 0 :(得分:1)

来自MSDN

  

删除在存储过程中创建的本地临时表   存储过程完成后自动完成。

由于您的EXEC(...)实际上是对存储过程的调用(想象sp_executesql#Test2超出范围,因此当您尝试从中进行选择时,EXEC ('CREATE TABLE #Test2 ('+@listCol2+'); SELECT * FROM #Test2'); 会被删除。您必须将SELECT放在相同的EXEC中:

{{1}}

答案 1 :(得分:0)

您可以选择以下选项。

EXEC ('CREATE TABLE #Test2 ('+@listCol2+'); Select * from #test2') 



EXEC ('CREATE TABLE ##Test2 ('+@listCol2+')') 

SELECT * FROM ##Test2 --it will not throws the name of the object isn't valid

DROP TABLE ##Test2


EXEC ('CREATE TABLE Test2 ('+@listCol2+')') 

SELECT * FROM Test2 --it will not throws the name of the object isn't valid

DROP TABLE Test2

答案 2 :(得分:0)

您的表创建错误,因此不存在。 #test2表的查询应该是这样的。日期不是定义的字段。

CREATE TABLE #Test2 ([2011-10] datetime,[2011-11] datetime,[2011-12] datetime,[2012-10] datetime)

如果我像这样修改你的sql并运行它,我会收到此错误

  

名称'CREATE TABLE#Test2([2011-10]日期,[2011-11]日期,[2011-12]   日期,[2012-10]日期)'不是有效的标识符。

修改后的代码

DECLARE @listCol2 varchar(max)
SET @listCol2 = 
    (SELECT DISTINCT ('[' + CONVERT(varchar,YEAR(TheDate)) + '-' + RIGHT('0'+CONVERT(varchar,MONTH(TheDate)),2) +'] date,')
     FROM #Test
     ORDER BY ('[' + CONVERT(varchar,YEAR(TheDate)) + '-' + RIGHT('0'+CONVERT(varchar,MONTH(TheDate)),2) +'] date,') ASC
     FOR XML PATH(''))
SET  @listCol2 = LEFT(@listCol2,LEN(@listCol2)-1)
SELECT  @listCol2

DECLARE @q varchar(4000)
set @q= 'CREATE TABLE #Test2 ('+@listCol2+')'

exec @q