仅使用值选择列

时间:2017-11-08 07:08:35

标签: sql sql-server sql-server-2008 tsql dynamic-sql

我在数据库中有一个表格结构如下。

col1  col2  col3  col4 col5  col6  frnkeyid1  frnkeyid2
-----------------------------------------------------------
  a     2    3                         2          4
  b     1    4                         2          5 
  c     12   5                         2          6 

在上表中,col4col5col6中未插入任何数据。 现在我想编写一个过程/查询,它从结果表中删除没有为该列输入值的所有列。

F.e。上表的结果:

col1  col2  col3 frnkeyid1  frnkeyid2
-----------------------------------------
  a     2    3      2          4
  b     1    4      2          5 
  c     12   5      2          6 

我该怎么做?

2 个答案:

答案 0 :(得分:2)

你可以试试这个。

-- For obtain used columns
DECLARE @ColNames NVARCHAR(MAX) =''
SELECT  @ColNames = @ColNames + ', ' + QUOTENAME(ColNames) 
FROM MyTable UNPIVOT( V FOR ColNames IN ([col1],[col2],[col3],[col4],[col5],[col6],[frnkeyid1],[frnkeyid2])) UNPVT
GROUP BY QUOTENAME(ColNames)


DECLARE @query NVARCHAR(MAX) = 'SELECT ' + STUFF(@ColNames,1,1,'') + ' FROM MyTable'

EXEC (@query)

结果:

col1        col2        col3        frnkeyid1   frnkeyid2
----------- ----------- ----------- ----------- -----------
1           2           3           2           4
2           1           4           2           5
3           12          5           2           6

答案 1 :(得分:1)

此解决方案从字面上删除结果表中的所有列

您需要使用动态SQL。让我举个例子。

我猜,no data表示NULL

CREATE TABLE dbo.test (
    col1  char(1),
    col2  int,
    col3  int,
    col4  int,
    col5  int,
    col6  int,
    frnkeyid1 int,  
    frnkeyid2 int
)

INSERT INTO dbo.test  VALUES
('a', 2,  3, NULL, NULL, NULL, 2, 4),
('b', 1,  4, NULL, NULL, NULL, 2, 5),
('c', 12, 5, NULL, NULL, NULL, 2, 6)

这是测试表的声明。要构建查询并执行它,请使用以下代码:

DECLARE @TableName sysname = N'test',
        @SQLQuery nvarchar(max) = N''

SELECT @SQLQuery = @SQLQuery + N'
IF (
SELECT CASE WHEN COUNT(DISTINCT '+ QUOTENAME(c.[name]) +') = 0 AND MAX(' + QUOTENAME(c.[name]) +') IS NULL THEN 1 ELSE 0 END
FROM ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(t.[Name]) + ') = 1
BEGIN
    ALTER TABLE ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(@TableName) + '
    DROP COLUMN '+ QUOTENAME(c.[name]) +'

    PRINT ''Column name '+ QUOTENAME(c.[name]) + ' was droped from table ' + QUOTENAME(s.[Name]) + '.' + QUOTENAME(@TableName) + '''
END;'
FROM sys.tables t
INNER JOIN sys.columns c
    ON t.[object_id] = c.[object_id]
INNER JOIN sys.schemas s
    On t.[schema_id] = s.[schema_id]
WHERE t.[name] = @TableName

PRINT @SQLQuery
--EXEC (@SQLQuery)

PRINT语句会给你这个

IF (
SELECT CASE WHEN COUNT(DISTINCT [col1]) = 0 AND MAX([col1]) IS NULL THEN 1 ELSE 0 END
FROM [dbo].[test]) = 1
BEGIN
    ALTER TABLE [dbo].[test]
    DROP COLUMN [col1]

    PRINT 'Column name [col1] was droped from table [dbo].[test]'
END;

每列。

因此,如果没有值列将被droped。你可以删除

ALTER TABLE dbo.[test]
DROP COLUMN [col1]

运行脚本以查看将从表中删除哪些列。

如果您在测试表上运行此脚本,然后执行:

SELECT *
FROM dbo.test

那会带给你:

col1    col2    col3    frnkeyid1   frnkeyid2
a       2       3       2           4
b       1       4       2           5
c       12      5       2           6