我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
我们都知道,要从表中选择所有列,可以使用
SELECT * FROM tableA
是否有一种方法可以在不指定所有列的情况下从表中排除列?
SELECT * [except columnA] FROM tableA
我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。
当前回答
在SQL Management Studio中,您可以展开对象资源管理器中的列,然后将columns树项拖到查询窗口中,以获得以逗号分隔的列列表。
其他回答
您可以使用REGEX列规范。
下面的查询选择除ds和hr之外的所有列 选择(ds |人力资源)? +。+来自销售
是的,这是可能的(但不建议)。
CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'
DECLARE @columns varchar(8000)
SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION
EXEC ('SELECT ' + @columns + ' FROM contact')
代码说明:
Declare a variable to store a comma separated list of column names. This defaults to NULL. Use a system view to determine the names of the columns in our table. Use SELECT @variable = @variable + ... FROM to concatenate the column names. This type of SELECT does not not return a result set. This is perhaps undocumented behaviour but works in every version of SQL Server. As an alternative you could use SET @variable = (SELECT ... FOR XML PATH('')) to concatenate strings. Use the ISNULL function to prepend a comma only if this is not the first column name. Use the QUOTENAME function to support spaces and punctuation in column names. Use the WHERE clause to hide columns we don't want to see. Use EXEC (@variable), also known as dynamic SQL, to resolve the column names at runtime. This is needed because we don't know the column names at compile time.
在SSMS中,智能感知和混叠是一种更简单的方法。试试这个 在文本编辑器中右键单击,并确保启用了智能感知。 输入一个别名[SELECT t.* FROM tablename t]的查询。 输入文本t.*并删除*,SSMS将自动列出以f为别名的表的列。 然后,您可以快速指定您想要的列,而不必使用SSMS将选择写入另一个脚本,然后执行更多的复制/粘贴操作。 我一直在用这个。
右键单击对象资源管理器中的表,选择前1000行
它会列出所有列,而不是*。然后删除不需要的列。应该比你自己打快多了。
然后,当你觉得这有点太多的工作,获得Red Gate的SQL提示,并从tbl输入ssf,转到*并再次单击选项卡。
当然,就像他们说的,你需要用动态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)