2016-12-10 4 views
0

空ではないテーブルから行のみを選択する関数が必要です。私の最初の試み:空でないすべての行を選択します。

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 function'がありますか?また、SQL Server関数は動的SQLをサポートしていません。 –

+2

こんにちはセバスチャン。 sys.tablesとsys.columnsを照会しているので、あなたが達成しようとしていることを教えてください。あなたが望む可能性の高いものの大部分は、Web上で利用可能なadmin SQL procsの例がおそらく数多くあります。行う。 –

+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, '')