Ваша таблица переменных @BuildTimes
недоступна внутри динамического SQL. Даже если вы объявите это и загрузите его с динамическим SQL, вы не сможете прочитать результаты за пределами динамической области.
Решение состоит в том, чтобы использовать временную таблицу вместо переменной:
IF OBJECT_ID('tempdb..#BuildTimes') IS NOT NULL
DROP TABLE #BuildTimes
CREATE TABLE #BuildTimes (
BuildTableName VARCHAR(max) NULL
,BuildDate DATE NULL
)
DECLARE @days INT = 0;
DECLARE @startDate DATE = GETDATE();
DECLARE @buildDate DATE = GETDATE();
DECLARE @sql nvarchar(max);
WHILE (@days <=30)
BEGIN
SET @buildDate = DATEADD(day, -1*@days, @startDate);
SET @sql='INSERT INTO #BuildTimes
SELECT *
FROM OPENROWSET(
''SQLNCLI'',
''SERVER=localhost;Trusted_Connection=yes;'',
''EXEC [LOG].[BuildTimes] @buildDate = ''''' + CAST(@buildDate AS VARCHAR) +''''''')'
PRINT @sql
EXEC(@sql)
SET @days = @days + 1
END
SELECT * FROM #BuildTimes
Таблица может быть прочитана вне EXEC
, потому что она была создана снаружи, и она доступна внутри, потому что она остается в том же сеансе.
В качестве примечания, избегайте использования *
всякий раз, когда вы ожидаете известный набор столбцов, поэтому, если новый столбец будет добавлен в базовые таблицы из SELECT
, вы INSERT
не сломаетесь.