Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изберете непразни колони с помощта на SQL Server

Не знам дали това е по-бързо, но може да използвате един трик:FOR XML AUTO ще пропусне колони без съдържание:

DECLARE @tbl TABLE(col1 INT,col2 INT,col3 INT);
INSERT INTO @tbl VALUES (1,2,NULL),(1,NULL,NULL),(NULL,NULL,NULL);

SELECT * 
FROM @tbl AS tbl
FOR XML AUTO

Това е резултатът:col3 липсва...

<tbl col1="1" col2="2" />
<tbl col1="1" />
<tbl />

Като знаете това, можете да намерите списъка с колони, които не са NULL във всички редове, по следния начин:

DECLARE @ColList VARCHAR(MAX)=
STUFF
(
    (
    SELECT DISTINCT ',' + Attr.value('local-name(.)','nvarchar(max)')
    FROM
    (
        SELECT
        (
            SELECT *
            FROM @tbl AS tbl
            FOR XML AUTO,TYPE
        ) AS TheXML
    ) AS t
    CROSS APPLY t.TheXML.nodes('/tbl/@*') AS A(Attr) 
    FOR XML PATH('')
    ),1,1,''
);

SELECT @ColList

Съдържанието на @ColList сега е col1,col2 . Този низ можете да поставите в динамично създаден SELECT .

АКТУАЛИЗАЦИЯ:Съвети

Би било много умно да замените SELECT * със списък с колони, създаден от INFORMATION_SCHEMA.COLUMNS с изключение на всички not-null . И - ако е необходимо и възможно - типове, които съдържат много големи данни (BLOB).

АКТУАЛИЗАЦИЯ 2:Производителност

Не знам какви са вашите много големи данни всъщност означава... Току-що опитах това на таблица с около 500 000 реда (с SELECT * ) и се върна правилно след по-малко от една минута. Надяваме се, това е достатъчно бързо...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Колоната е невалидна в списъка за избор, защото не се съдържа нито в агрегатна функция, нито в клаузата GROUP BY

  2. актуализиране на множество колони с помощта на оператор case в sql сървър

  3. SQL Server изпълнява резервно копие с C#

  4. Консолидиране на екземпляр на SQL Server чрез клъстериране и подреждане

  5. как да декларирам глобална променлива в SQL Server ..?