是否有可能从表中选择alle列,除了一个(例如ID)?

时间:2017-12-14 09:30:10

标签: sql-server ssms

我正在使用第三方应用程序,每个表的列数都是荒谬的。当我选择数据时,我经常需要除ID以外的所有列。或者除了ID和DateCreated之外的所有列。

使用sys.columns可以找出表中可用的列。如何使用此信息创建语句?最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

此脚本将选择除表的主键列和列名DateCreated之外的任何表的所有列。

SELECT
'SELECT '+
SUBSTRING(LIST,1,LEN(LIST)-1)
+' FROM [Person].[Address]'
FROM
(
SELECT
    '['+COL.COLUMN_NAME+'],'
    FROM INFORMATION_SCHEMA.COLUMNS COL
        LEFT JOIN
        (
            SELECT
                CON.CONSTRAINT_TYPE,
                USG.TABLE_SCHEMA,
                USG.TABLE_NAME,
                USG.COLUMN_NAME,
                CON.CONSTRAINT_NAME,
                USG.TABLE_CATALOG
                FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE USG
                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS CON
                    ON USG.CONSTRAINT_NAME = CON.CONSTRAINT_NAME
        )Q
            ON COL.TABLE_SCHEMA = Q.TABLE_SCHEMA
                AND COL.TABLE_NAME = Q.TABLE_NAME 
                AND COL.TABLE_CATALOG = Q.TABLE_CATALOG
                AND COL.COLUMN_NAME = Q.COLUMN_NAME
        WHERE COL.TABLE_SCHEMA ='Person'
            AND COL.TABLE_NAME = 'Address'
            AND 
            (
                Q.CONSTRAINT_TYPE <> 'PRIMARY KEY'
                OR
                COL.COLUMN_NAME <> 'DateCreated'
            )
            FOR XML PATH(''))L(LIST)

将字符串Person替换为您的架构,地址替换为您的表名

答案 1 :(得分:0)

尝试使用动态查询:

    DECLARE @Names VARCHAR(MAX)

    SELECT @Names = COALESCE(@Names + ', ', '') + Column_Name
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE Table_name='Table1'
    And Column_Name!='ID'

    DECLARE @Query VARCHAR(MAX)

    SELECT @Query = 'SELECT '+ @Names + ' INTO Table2 FROM Table1'

    exec (@Query)


    SELECT * from Table2