我在数据库中有一个表格结构如下。
col1 col2 col3 col4 col5 col6 frnkeyid1 frnkeyid2
-----------------------------------------------------------
a 2 3 2 4
b 1 4 2 5
c 12 5 2 6
在上表中,col4
,col5
和col6
中未插入任何数据。
现在我想编写一个过程/查询,它从结果表中删除没有为该列输入值的所有列。
F.e。上表的结果:
col1 col2 col3 frnkeyid1 frnkeyid2
-----------------------------------------
a 2 3 2 4
b 1 4 2 5
c 12 5 2 6
我该怎么做?
答案 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