Перебирайте столбцы временных таблиц, чтобы выбрать их - PullRequest
0 голосов
/ 03 июля 2018

У меня есть окончательная временная таблица (#tempTable) с неизвестным номером столбца. Мой последний выбор таков, он работает:

SELECT temp.* FROM #tempTable temp

Но вместо '*' я бы хотел назвать каждый столбец индивидуально:

SELECT temp.col1, temp.col2 FROM #tempTable temp

Для этого мне нужно перебрать имена моих столбцов и создать процедуру, я попробовал что-то вроде этого:

DECLARE @ColName VARCHAR(255)
SELECT @ColName = min(name) FROM   tempdb.sys.columns
            WHERE  object_id = Object_id('tempdb..#TEMPTABLE'); 
WHILE @ColName is not null
BEGIN
-- i need to do it all in once and not each time....
declare @sql varchar(max) = 'SELECT tp.'+'@COlName'+'FROM #TEMPTABLE tp'
exec(@sql)
-- Increment the value, how to go to next column ?
select @ColName = min(name) FROM tempdb.sys.columns WHERE  object_id = 
Object_id('tempdb..#TEMPTABLE') > @ColName -- does not work because it is a string (column name)
END

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Подход, основанный на множестве

IF OBJECT_ID('tempdb..#TEMPTABLE','U') IS NOT NULL
    DROP TABLE #TEMPTABLE;
CREATE TABLE #TEMPTABLE (
     Id     INT IDENTITY(1,1) 
    ,Col1   INT
    ,Col2   BIGINT
    ,Col3   BIGINT
    ,Col4   DATETIME
    ,Col5   DATETIME
) ;

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL =   N'SELECT ' + SUBSTRING((
                                    SELECT  N', temp.' + S.name
                                    FROM
                                            tempdb.sys.columns S
                                    WHERE
                                            S.object_id = OBJECT_ID('tempdb..#TEMPTABLE')
                                    ORDER BY
                                            S.column_id
                                    FOR XML PATH('')
                                )
                                ,2
                                ,200000
                        )   + N' FROM #TEMPTABLE temp'
EXEC sys.sp_executesql @SQL
0 голосов
/ 03 июля 2018

Попробуйте это:

DECLARE @ColName VARCHAR(2000) = 'select '
SELECT @ColName = @ColName + ' temp.' + name + ',' FROM tempdb.sys.columns
            WHERE  object_id = Object_id('tempdb..#TEMPTABLE')
--delete last character, which is comma and append table name
@ColName = substring(@ColName, 1, LEN(@ColName) - 1) + ' from #TEMPTABLE temp'

exec(@ColName)

Этот запрос строит весь список таблиц, объединенных в оператор select ... from .... Я увеличил размер переменной varchar, чтобы она могла вместить длинные запросы.

Кроме того, имя переменной IMO, например @sql или @query, будет более значимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...