Sql server 是否可以从表中选择除一列(例如ID)之外的所有列?

Sql server 是否可以从表中选择除一列(例如ID)之外的所有列?,sql-server,ssms,Sql Server,Ssms,我使用的是一个第三方应用程序,每个表的列数都非常多。当我选择数据时,通常需要ID之外的所有列,或者ID和DateCreated之外的所有列 SELECT 'SELECT '+ SUBSTRING(LIST,1,LEN(LIST)-1) +' FROM [Person].[Address]' FROM ( SELECT '['+COL.COLUMN_NAME+'],' FROM INFORMATION_SCHEMA.COLUMNS COL LEFT JOIN

我使用的是一个第三方应用程序,每个表的列数都非常多。当我选择数据时,通常需要ID之外的所有列,或者ID和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)

使用sys.columns可以找出表中哪些列可用。如何使用此信息创建语句?执行此操作的最佳方法是什么?

尝试使用动态查询:

    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

此脚本将选择任何表的所有列,但表的主键列和列名称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替换为schema,Address替换为table name

为什么不包括所有列,而忽略数据中也包含ID这一事实?您需要在SELECT语句中提供除此之外的所有列。如果您可以在SSMS中编写查询,只需打开数据库,向下滚动到要查看的表,单击旁边的小+图标,然后将Columns文件夹拖到查询窗口中。这将得到该表中所有列的列表。然后,您可以简单地删除您不需要的列。@Rob Anthony:我想使用except来查找双重数据。在ID中总是有一个唯一的数字,所以当我使用它时,它就不再起作用了。@SchmitzIT:我知道,这就是我现在所做的。我很懒……这很有效。我也喜欢你的加入。提到的ID是FK的,所以Jayasurya Satheesh的答案更合适。谢谢你和我一起思考!工作起来很有魅力!我将看到如何尽可能有效地使用它,并将在稍后的问题中发布。