【问题标题】:Iterate through temporary table columns to select them遍历临时表列以选择它们
【发布时间】:2018-07-03 11:54:06
【问题描述】:

我有一个列号未知的最终临时表 (#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

【问题讨论】:

  • 在这种情况下,SELECT * 究竟有什么问题?如果您想返回所有列,并且您不知道这些列是什么,那么在这种情况下,我建议SELECT * 是允许的。
  • 为什么不SELECT *
  • 我被要求不要使用 SELECT *... 来查看请求中的列名。

标签: sql sql-server procedure dynamic-columns


【解决方案1】:

试试这个:

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 变量的大小,因此它可以容纳长查询。

此外,@sql@query 等 IMO 变量名称会更有意义。

【讨论】:

  • 如果可以的话,我建议尝试使用基于集合的方法来构建它。返回具有自引用变量 (SELECT @ColName = @ColName + ...) 的多行数据集的查询实际上是一种循环形式,因为它逐行(痛苦地)处理结果集;在 SQL Server 中速度非常慢。
  • 谢谢!您只是在最后一个 @ColName 之前忘记了“SELECT” :)
【解决方案2】:

基于集合的方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2017-07-31
    • 2016-08-29
    • 1970-01-01
    • 2017-08-19
    • 2013-06-23
    • 2011-10-28
    • 2014-12-07
    相关资源
    最近更新 更多