2016-12-10 5 views
0

Я хочу функцию, которая выбирает только строки из таблицы, которая не является пустой. Моя первая попытка:SELECT Все строки, которые не являются пустым

declare @col varchar(255), @cmd varchar(max); 
DECLARE @Select VARCHAR(3000) 
DECLARE @Werteneu VARCHAR(3000) 
DECLARE @Tablename VARCHAR(3000) 

SELECT @Tablename = 'AD' 
DECLARE getinfo cursor for 

SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID 
WHERE t.Name = @Tablename 
SELECT @Werteneu = @Tablename 
OPEN getinfo 
FETCH NEXT FROM getinfo into @col 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    IF EXISTS (SELECT TOP 1 * FROM AD WHERE ' + @col + ' IS NOT NULL) BEGIN 
    END 
    FETCH NEXT FROM getinfo into @col 
END 
CLOSE getinfo 
DEALLOCATE getinfo 
exec ('select ' + @Werteneu + ' from AD') 

Пожалуйста, замените «AD» на свой тестовый стол. Моя проблема в том, что IF EXISTS (SELECT TOP 1 * FROM AD WHERE ' + @col + ' IS NOT NULL) BEGIN начинаются, хотя строка пуста.

+2

Где функция 'create ', если вы хотите использовать функцию? А функции SQL Server не поддерживают динамический SQL. –

+2

Привет Себастьян. Поскольку вы запрашиваете sys.tables и sys.columns, почему бы вам не рассказать нам о том, чего вы пытаетесь достичь, вероятно, есть сотни примеров рабочих обработок SQL-proc, доступных в Интернете, для большей части того, что вы, вероятно, захотите делать. –

+0

Все это звучит неправильно ... зачем вы хотите возвращать каждую строку из каждой таблицы (не пустой)? Какой у Вас вопрос? Безопасность, похоже, не является частью этого –

ответ

2

Команда EXCEPT может использоваться для удаления любых строк, соответствующих определенным критериям. В некоторых средах операция SORT может быть дорогой (это может быть исправлено с хорошей индексацией)

SELECT 
    ColA 
    ,ColB 
    ,ColC 
    ,ColD 
    ,ColE 
    ,ColF 
    ,ColG 
FROM 
    mytable 
EXCEPT 
SELECT 
    NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 
    ,NULL 

Вот код, который будет динамически создавать запрос.

DECLARE @tablename VARCHAR(255) = 'Employee' 
DECLARE @schemaname VARCHAR(255) = 'HumanResources' 
DECLARE @qrystr NVARCHAR(2000) = '' 

;with cte 
    AS 
    (
    SELECT 
     c.column_id 
     ,c.name 
    FROM 
     sys.objects o 
      INNER JOIN sys.columns c 
       ON 
       o.object_id = c.object_id 
    WHERE 
     o.name = @tablename 
     AND 
     SCHEMA_NAME(o.schema_id) = @schemaname 
    ) 
SELECT 
    @qrystr = 
    'SELECT ' 
    + STUFF((SELECT ',' + name FROM cte ORDER BY column_id FOR XML PATH ('')), 1, 1, '') 
    + ' FROM ' 
    + @schemaname + '.' + @tablename 
    + ' EXCEPT ' 
    + ' SELECT ' 
    + STUFF((SELECT ',' + 'NULL' FROM cte FOR XML PATH ('')), 1, 1, '') 
Смежные вопросы