【问题标题】:SQL Server - select columns from given rangeSQL Server - 从给定范围中选择列
【发布时间】:2011-09-13 05:11:42
【问题描述】:

我有一个表格,其中有如下列

[Index], [Length],[N1],[N2]....[N99]

现在,可以只选择[N2]] ... [N29] 列而不写入所有名称。

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

不,这是不可能的。您需要明确列出要返回的列的子集。

【讨论】:

    【解决方案2】:

    如果不写所有名称,这是不可能的。

    【讨论】:

      【解决方案3】:

      您当然可以从对象浏览器中拖放所有列,然后删除不需要的列。至少那样你没有任何错别字。

      我会担心包含这么多列的表格的设计。特别是如果他们真的是 N1-N99。您可能需要重新设计相关表。此外,宽表可能会导致性能问题。

      【讨论】:

        【解决方案4】:

        这个怎么样:

        DECLARE @columns VARCHAR(MAX), 
                @tablename VARCHAR(255), 
                @from VARCHAR(255), 
                @select VARCHAR(100)
        
        SET @tablename = 'orderheader'
        
        SELECT @columns = STUFF(
        (
            SELECT ',[' + column_name + ']'
            FROM information_schema.columns
            WHERE table_name = @tablename
            AND NOT column_name IN ('N2', 'Index', 'Length')
            FOR XML PATH('')
        ),1, 1, '')
        
        SELECT @select = 'SELECT ', @from = ' from ' + @tablename
        
        EXEC(@select + @columns + @from)
        

        【讨论】:

        • 使用动态 sql 来节省几分钟的打字时间是一个糟糕的选择。
        • @HLGEM - 这不是这里的问题,问题是它可以完成。答案是:只能用动态sql,这就是它可以做到的。在极端情况下,它会加快 sql 的速度以选择更少的列。 +1
        • 这是唯一的解决方案。我认为 -1 我是一个不好的理由。
        • 我不反对 HLGEM,不过,如果添加了新列,动态 SQL 解决方案将会处理。由于他们有 N2...N100 之类的列名,我建议他们经常插入列。
        【解决方案5】:

        使用动态 sql 是最接近不写列的方法。这是一个例子:

        declare @sql varchar(max)
        
        select @sql = coalesce(@sql+',', 'select ') + 'n' + cast(number as varchar(2))
        from master..spt_values as N 
        where type = 'P' and 
        number between 2 and 29 
        
        set @sql = @sql + ' from <yourtable>'
        
        --select @sql
        exec (@sql)
        

        【讨论】:

        • 投反对票有点苛刻,因为这是:select n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15 ,n16,n17,n18,n19,n20,n21,n22,n23,n24,n25,n26,n27,n28,n29 来自
        • 动态 SQL 是该问题的唯一解决方案。我认为“不可能”将是一个不正确的答案。 “不优选”是正确的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        相关资源
        最近更新 更多