где остается контекст данных запроса exec? - PullRequest
1 голос
/ 27 января 2012

Я использую команду exec ("query_string") на сервере sql. Дело в том, что изменения, выполненные этой командой, не видны снаружи.

Я имею в виду, что я пытаюсь создать временную таблицу с динамическими столбцами в команде exec, и она работает нормально, но когда я пытаюсь сделать оператор выбора над созданной таблицей, я получаю сообщение об ошибке, в котором говорится, что таблица не существует.

Я знаю, что это проблема контекста, и я хочу понять, как выполнить команду 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 ]

1 голос
/ 27 января 2012

С MSDN :

Локальная временная таблица, созданная в хранимой процедуре, автоматически удаляется по завершении хранимой процедуры.

Сваш EXEC (...) фактически является вызовом хранимого процесса (думаю, sp_executesql), что #Test2 находится вне области видимости, поэтому отбрасывается, когда вы пытаетесь выбрать из него.Вы должны поместить SELECT в тот же EXEC:

EXEC ('CREATE TABLE #Test2 ('+@listCol2+'); SELECT * FROM #Test2');
0 голосов
/ 27 января 2012

Ваша таблица создана неправильно и, следовательно, не существует.Запрос к таблице # 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 
0 голосов
/ 27 января 2012

вы можете иметь следующие опции.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...