2011-02-07 3 views
7

Есть ли SQL жаргон вернуть только первые два columns таблицы БЕЗ зная поле имена?SQL вернуть первые два столбца таблицы

Что-то вроде

SELECT Column(1), Column(2) FROM Table_Name 

Или я должен пойти длинный путь вокруг и узнать имена столбцов первой? Как мне это сделать?

+2

См: http://stackoverflow.com/questions/368505/is- it-possible-to-select-sql-server-data-using-column-ordinal-position – NYSystemsAnalyst

+3

И почему вы запрашиваете таблицу, если не знаете имена столбцов? – HLGEM

ответ

5

Сначала вы должны получить имена столбцов. Большинство платформ поддерживают это:

select column_name,ordinal_position 
    from information_schema.columns 
where table_schema = ... 
    and table_name = ... 
    and ordinal_position <= 2 
+0

за исключением, может быть, одного очень популярного dbms, идущего по имени Oracle – RichardTheKiwi

0

SQL не понимает порядок столбцов. Вам нужно знать имена столбцов, чтобы их получить.

Чтобы получить имена столбцов, вы можете запросить информацию. Например:

SELECT column_name 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'tbl_name' 
    ORDER BY ordinal_position 
    LIMIT 2; 
+0

Ошибка SQL Server Express 2008 на LIMIT 2 бит - возможно, я должен упомянуть, что я использовал. –

0

Вы можете запросить sysobject таблицы, чтобы выяснить, первые два столбца динамически генерировать оператор SQL вам нужно.

0

Если вы хотите, чтобы объект permant, который вы можете запрашивать снова и снова, отображал представление для каждой таблицы, которая возвращает только первые 2 столбца. Вы можете назвать столбцы Column1 и Column2 или использовать существующие имена.

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

0

Или мне нужно пройти длинный путь и сначала узнать имена столбцов? Как мне это сделать?

Это довольно легко сделать вручную.
Просто запустите этот первый

select * from tbl where 1=0 

Это утверждение работает на все основное СУБД без необходимости каких-либо системных каталогов. Это дает вам все имена столбцов, то все, что вам нужно сделать, это набрать первые два

select colname1, colnum2 from tbl 
2

Там подмигнуло

declare @select varchar(max) 
set @select = 'select ' 

select @[email protected]+COLUMN_NAME+',' 
from information_schema.columns 
where table_name = 'TABLE' and ordinal_position <= 2 

set @select=LEFT(@select,LEN(@select)-1)+' from TABLE' 
exec(@select) 
1

Я написал хранимую процедуру некоторое время назад, чтобы сделать это точным работа. Несмотря на то, что в теории отношений нет технического порядка столбцов, SSMS не является полностью реляционным. Система хранит порядок, в который были вставлены столбцы, и присваивает им идентификатор. Этот порядок выполняется с использованием типичного оператора SELECT *, поэтому ваши операторы SELECT кажутся возвращать один и тот же порядок каждый раз. На практике никогда не было хорошей идеи SELECT * с чем-либо, поскольку она не блокирует порядок результата в терминах столбцов или строк. Тем не менее, я думаю, что люди так зацикливаются на том, «что вы не должны этого делать», что они не пишут сценарии, которые на самом деле могут это сделать. Факт - это предсказуемое поведение системы, поэтому почему бы не использовать его, если задача не очень важна.

Этот SPROC, конечно, имеет оговорки и написан на T-SQL, но если вы хотите просто вернуть все значения с тем же поведением SELECT *, то это должно сделать работу довольно легко для вас. Введите имя таблицы, количество столбцов и нажмите F5. Он возвращает их в порядке слева направо так же, как вы ожидали. Я ограничил его только 5 столбцами, но вы можете отредактировать логику, если вам нужно больше. Принимает как временные, так и постоянные таблицы.

EXEC OnlySomeColumns 'MyTable', 3

/*------------------------------------------------------------------------------------------------------------------ 

    Document Title: The Unknown SELECT SPROC.sql 

    Created By: CR 
    Date: 4.28.2013 

    Purpose: Returns all results from temp or permanent table when not knowing the column names 

    SPROC Input Example: EXEC OnlySomeColumns 'MyTable', 3 

--------------------------------------------------------------------------------------------------------------------*/ 

    IF OBJECT_ID ('OnlySomeColumns', 'P') IS NOT NULL 
    DROP PROCEDURE OnlySomeColumns; 

    GO 

     CREATE PROCEDURE OnlySomeColumns 
       @TableName  VARCHAR (1000), 
       @TotalColumns INT 

    AS 

     DECLARE @Column1  VARCHAR (1000), 
       @Column2  VARCHAR (1000), 
       @Column3  VARCHAR (1000), 
       @Column4  VARCHAR (1000), 
       @Column5  VARCHAR (1000), 
       @SQL   VARCHAR (1000), 
       @TempTable  VARCHAR (1000), 
       @PermanentTable VARCHAR (1000), 
       @ColumnNamesAll VARCHAR (1000) 

     --First determine if this is a temp table or permanent table 
     IF @TableName  LIKE '%#%' BEGIN SET @TempTable  = @TableName END --If a temporary table 
     IF @TableName NOT LIKE '%#%' BEGIN SET @PermanentTable = @TableName END --If a permanent column name 

    SET NOCOUNT ON 

     --Start with a few simple error checks 
     IF (@TempTable = 'NULL' AND @PermanentTable = 'NULL') 
      BEGIN 
       RAISERROR ('ERROR: Please select a TempTable or Permanent Table.',16,1) 
      END 

     IF (@TempTable <> 'NULL' AND @PermanentTable <> 'NULL') 
      BEGIN 
       RAISERROR ('ERROR: Only one table can be selected at a time. Please adjust your table selection.',16,1) 
      END 

     IF (@TotalColumns IS NULL) 
      BEGIN 
       RAISERROR ('ERROR: Please select a value for @TotalColumns.',16,1) 
      END 

    --Temp table to gather the names of the columns 
    IF Object_id('tempdb..#TempName') IS NOT NULL DROP TABLE #TempName 
    CREATE TABLE #TempName (ID INT, Name VARCHAR (1000)) 

     --Select the column order from a temp table 
     IF @TempTable <> 'NULL' 
      BEGIN  
       --Verify the temp table exists 
       IF NOT EXISTS (SELECT 1 
           FROM tempdb.sys.columns 
           WHERE object_id = object_id ('tempdb..' + @TempTable +'')) 
       BEGIN 
        RAISERROR ('ERROR: Your TempTable does not exist - Please select a valid TempTable.',16,1) 
          RETURN 
         END 

       SET @SQL = 'INSERT INTO #TempName 
          SELECT column_id AS ID, Name 
          FROM tempdb.sys.columns 
          WHERE object_id = object_id (''tempdb..' + @TempTable +''') 
          ORDER BY column_id' 
       EXEC (@SQL) 
      END 

     --From a permanent table 
     IF @PermanentTable <> 'NULL' 
      BEGIN  
       --Verify the temp table exists 
       IF NOT EXISTS (SELECT 1 
           FROM syscolumns 
           WHERE id = (SELECT id 
               FROM sysobjects 
               WHERE Name = '' + @PermanentTable + '')) 
       BEGIN 
        RAISERROR ('ERROR: Your Table does not exist - Please select a valid Table.',16,1) 
          RETURN 
         END 

       SET @SQL = 'INSERT INTO #TempName 
          SELECT colorder AS ID, Name 
          FROM  syscolumns 
          WHERE id = (SELECT id 
             FROM sysobjects 
             WHERE Name = ''' + @PermanentTable + ''') 
          ORDER BY colorder' 
       EXEC (@SQL) 
      END 

     --Set the names of the columns 
     IF @TotalColumns >= 1 BEGIN SET @Column1 = (SELECT Name FROM #TempName WHERE ID = 1) END 
     IF @TotalColumns >= 2 BEGIN SET @Column2 = (SELECT Name FROM #TempName WHERE ID = 2) END 
     IF @TotalColumns >= 3 BEGIN SET @Column3 = (SELECT Name FROM #TempName WHERE ID = 3) END 
     IF @TotalColumns >= 4 BEGIN SET @Column4 = (SELECT Name FROM #TempName WHERE ID = 4) END 
     IF @TotalColumns >= 5 BEGIN SET @Column5 = (SELECT Name FROM #TempName WHERE ID = 5) END 

    --Create a select list of only the column names you want 
    IF Object_id('tempdb..#FinalNames') IS NOT NULL DROP TABLE #FinalNames 
    CREATE TABLE #FinalNames (ID INT, Name VARCHAR (1000)) 

      INSERT #FinalNames 
      SELECT '1' AS ID, @Column1 AS Name UNION ALL 
      SELECT '2' AS ID, @Column2 AS Name UNION ALL 
      SELECT '3' AS ID, @Column3 AS Name UNION ALL 
      SELECT '4' AS ID, @Column4 AS Name UNION ALL 
      SELECT '5' AS ID, @Column5 AS Name 

      --Comma Delimite the names to insert into a select statement. Bracket the names in case there are spaces 
      SELECT @ColumnNamesAll = COALESCE(@ColumnNamesAll + '], [' ,'[') + Name 
      FROM #FinalNames 
      WHERE Name IS NOT NULL 
      ORDER BY ID 

      --Add an extra bracket at the end to complete the string 
      SELECT @ColumnNamesAll = @ColumnNamesAll + ']' 

     --Tell the user if they selected to many columns 
     IF (@TotalColumns > 5 AND EXISTS (SELECT 1 FROM #FinalNames WHERE Name IS NOT NULL)) 
      BEGIN 
       SELECT 'This script has been designed for up to 5 columns' AS ERROR 
       UNION ALL 
       SELECT 'Only the first 5 columns have been selected' AS ERROR 
      END 

     IF Object_id('tempdb..#FinalNames') IS NOT NULL DROP TABLE ##OutputTable 

     --Select results using only the Columns you wanted 
     IF @TempTable <> 'NULL' 
      BEGIN 
       SET @SQL = 'SELECT ' + @ColumnNamesAll + ' 
          INTO ##OutputTable 
          FROM  ' + @TempTable + ' 
          ORDER BY 1' 
       EXEC (@SQL) 
      END 

     IF @PermanentTable <> 'NULL' 
      BEGIN 
       SET @SQL = 'SELECT ' + @ColumnNamesAll + ' 
          INTO ##OutputTable 
          FROM  ' + @PermanentTable + ' 
          ORDER BY 1' 
       EXEC (@SQL) 
      END 

    SELECT * 
    FROM ##OutputTable 

    SET NOCOUNT OFF 
1

dynamic query использованием for xml path также будет делать работу:

declare @sql varchar(max) 
set @sql = (SELECT top 2 COLUMN_NAME + ',' from information_schema.columns where table_name = 'YOUR_TABLE_NAME_HERE' order by ordinal_position for xml path('')) 
set @sql = (SELECT replace(@sql +' ',', ','')) 
exec('SELECT ' + @sql + ' from YOUR_TABLE_NAME_HERE') 
Смежные вопросы