我想要一个只从表中选择行的函数,它不是空的。我的第一次尝试:
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
开始,尽管行是空的。
答案 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, '')