我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
当前回答
当然,就像他们说的,你需要用动态sql实现。这是我的实现:
SET NOCOUNT ON
DECLARE @Table NVARCHAR(100) = 'Table' --Table to Select
DECLARE @ExcludeColumns AS TABLE (ColumnName VARCHAR(255))
INSERT INTO @ExcludeColumns VALUES ('ExcludedColumn1'),('ExcludedColumn2') --Excluded columns
DECLARE @SelectedColumns NVARCHAR(MAX) = ''
SELECT
@SelectedColumns += CASE WHEN LEN(@SelectedColumns) = 0 THEN '' ELSE ',' END + '[' + COLUMN_NAME + ']'
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @Table AND COLUMN_NAME NOT IN (SELECT ColumnName FROM @ExcludeColumns)
DECLARE @sqlStatement NVARCHAR(MAX) = 'SELECT ' + @SelectedColumns + ' FROM [' + @Table + ']'
PRINT @sqlStatement
EXEC (@sqlStatement)
其他回答
我这样做了,它工作得很好(版本5.5.41):
# prepare column list using info from a table of choice
SET @dyn_colums = (SELECT REPLACE(
GROUP_CONCAT(`COLUMN_NAME`), ',column_name_to_remove','')
FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE
`TABLE_SCHEMA`='database_name' AND `TABLE_NAME`='table_name');
# set sql command using prepared columns
SET @sql = CONCAT("SELECT ", @dyn_colums, " FROM table_name");
# prepare and execute
PREPARE statement FROM @sql;
EXECUTE statement;
如果您有许多列,而您只想排除其中一列。您可以使用下面的命令 从表中选择* exclude(列名)
在SSMS中,智能感知和混叠是一种更简单的方法。试试这个 在文本编辑器中右键单击,并确保启用了智能感知。 输入一个别名[SELECT t.* FROM tablename t]的查询。 输入文本t.*并删除*,SSMS将自动列出以f为别名的表的列。 然后,您可以快速指定您想要的列,而不必使用SSMS将选择写入另一个脚本,然后执行更多的复制/粘贴操作。 我一直在用这个。
通常的最佳实践是指定需要哪些列,而不是仅仅指定*。因此,您只需声明希望select返回哪些字段。
根据表的大小,您可以将其导出到Excel中,并将其转置为一个新表,其中原始表的列将是新表中的行。然后将其返回到SQL数据库中,根据条件选择行并将它们插入到另一个新表中。最后,将这个更新的表导出到Excel,并进行另一次转置,以获得所需的表,并将其带回SQL数据库。
不确定转置是否可以在SQL数据库中完成,如果是,那么它会更容易。
Jeff