首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >exec查询数据上下文保留在哪里?

exec查询数据上下文保留在哪里?
EN

Stack Overflow用户
提问于 2012-01-27 04:37:54
回答 3查看 133关注 0票数 1

我在sql server上使用exec("query_string")命令。问题是,此命令执行的更改不能在外部看到。

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

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

代码语言:javascript
复制
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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-27 04:43:56

您可以使用以下选项。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2012-01-27 04:51:55

来自MSDN

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

因为你的执行(...)实际上是对存储进程的调用(假设是sp_executesql)当您尝试从中进行选择时,#Test2超出了作用域,因此被删除。您必须将SELECT放在同一个EXEC中:

代码语言:javascript
复制
EXEC ('CREATE TABLE #Test2 ('+@listCol2+'); SELECT * FROM #Test2');
票数 1
EN

Stack Overflow用户

发布于 2012-01-27 04:46:55

您的表创建错误,因此不存在。对#test2表的查询应该如下所示。日期不是已定义的字段。

代码语言:javascript
复制
CREATE TABLE #Test2 ([2011-10] datetime,[2011-11] datetime,[2011-12] datetime,[2012-10] datetime)

如果我像这样修改您的sql并运行它,我会得到这个错误

名称“CREATE TABLE #Test2 (2011-10 date,2011-11 date,2011-12 date,2012-10 date)”不是有效的标识符。

修改后的代码

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9024980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档