ВЫБРАТЬ * ИСКЛЮЧИТЬ - PullRequest
       61

ВЫБРАТЬ * ИСКЛЮЧИТЬ

49 голосов
/ 05 января 2009

Есть ли СУБД, которая реализует что-то вроде SELECT * EXCEPT? Мне нужно получить все поля, кроме определенного поля TEXT / BLOB, и я хотел бы просто выбрать все остальное.

Почти каждый день я жалуюсь своим коллегам, что кто-то должен это реализовать ... Это ужасно раздражает, что этого не существует.

Редактировать: Я понимаю, что все беспокоятся о SELECT *. Я знаю риски, связанные с SELECT *. Однако это, по крайней мере, в моей ситуации, не будет использоваться ни для кода уровня производства, ни даже кода уровня разработки; строго для отладки, когда мне нужно легко увидеть все значения.

Как я уже говорил в некоторых комментариях, я работаю исключительно в командной строке, делая все через ssh. Это затрудняет использование любых инструментов графического интерфейса (внешние подключения к базе данных не допускаются) и т. Д. И т. Д.

Спасибо за предложения.

Ответы [ 14 ]

0 голосов
/ 24 марта 2017

Мне нужно что-то вроде того, что @Glen просит облегчить мою жизнь с HASHBYTES ().

Моим вдохновением были ответы @Jasmine и @Zerubbabel. В моем случае у меня разные схемы, поэтому одно и то же имя таблицы встречается в sys.objects несколько раз. Поскольку это может помочь кому-то с тем же сценарием, вот оно:

ALTER PROCEDURE [dbo].[_getLineExceptCol]

@table SYSNAME,
@schema SYSNAME,
@LineId int,
@exception VARCHAR(500)

AS

DECLARE @SQL NVARCHAR(MAX)

BEGIN

SET NOCOUNT ON;

SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name 
FROM sys.columns 
WHERE name <> @exception 
AND object_id = (SELECT object_id FROM sys.objects 
                 WHERE name LIKE @table 
                 AND schema_id = (SELECT schema_id FROM sys.schemas WHERE name LIKE @schema))   

SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @schema + '.' + @table + ' WHERE Id = ' + CAST(@LineId AS nvarchar(50))

EXEC(@SQL)
END
GO
0 голосов
/ 12 августа 2016

Это старый вопрос, но я надеюсь, что этот ответ все еще может быть полезным для других. Его также можно изменить, добавив более одного, кроме полей . Это может быть очень удобно, если вы хотите развернуть таблицу со многими столбцами.

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name FROM sys.columns WHERE name <> 'colName' AND object_id = (SELECT id FROM sysobjects WHERE name = 'tblName')
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + 'tblName'
EXEC sp_executesql  @SQL

Хранимая процедура:

usp_SelectAllExcept 'tblname', 'colname'

ALTER PROCEDURE [dbo].[usp_SelectAllExcept]
(
  @tblName SYSNAME
 ,@exception VARCHAR(500)
)
AS

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name from sys.columns where name <> @exception and object_id = (Select id from sysobjects where name = @tblName)
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @tblName

EXEC sp_executesql @SQL
0 голосов
/ 08 июля 2010
declare @sql nvarchar(max)
        @table char(10)
set @sql = 'select '
set @table = 'table_name'

SELECT @sql = @sql + '[' + COLUMN_NAME + '],'
FROM   INFORMATION_SCHEMA.Columns
WHERE  TABLE_NAME = @table
   and COLUMN_NAME <> 'omitted_column_name'
SET    @sql = substring(@sql,1,len(@sql)-1) + ' from ' + @table

EXEC (@sql);
0 голосов
/ 05 января 2009

Как говорят другие: SELECT * - плохая идея.

Некоторые причины:

  1. Получите только то, что вам нужно (все остальное - пустая трата)
  2. Индексирование (индексируйте то, что вам нужно, и вы можете получить его быстрее. Если вы также запросите несколько неиндексированных столбцов, ваши планы запросов пострадают.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...