我创建了一个包含3个字段的临时表#test:ColumnName,TableName和Id。 我想看看#test表中的哪些行(各自表中的列)不是空的?即,对于ColumnName字段中的每个列名,以及TableName字段中找到的相应表,我想查看该列是否为空。尝试了一些事情(见下文),但没有得到任何结果。求助。
declare @LoopCounter INT = 1, @maxloopcounter int, @test varchar(100),
@test2 varchar(100), @check int
set @maxloopcounter = (select count(TableName) from #test)
while @LoopCounter <= @maxloopcounter
begin
DECLARE @PropIDs TABLE (tablename varchar(max), id int )
Insert into @PropIDs (tablename, id)
SELECT [tableName], id FROM #test
where id = @LoopCounter
set @test2 = (select columnname from #test where id = @LoopCounter)
declare @sss varchar(max)
set @sss = (select tablename from @PropIDs where id = @LoopCounter)
set @check = (select count(@test2)
from (select tablename
from @PropIDs
where id = @LoopCounter) A
)
print @test2
print @sss
print @check
set @LoopCounter = @LoopCounter + 1
end
答案 0 :(得分:1)
要在@Check=
查询中将变量用作列名和表名,您需要使用Dynamic SQL。
答案 1 :(得分:0)
最有可能采用更好的方法来做到这一点,但我无法想到一个方法。这就是我要做的。
使用select并声明游标而不是while循环。这样你就不必依赖顺序id了。游标将获取字段columnname,id和tablename
在循环中构建动态sql语句
设置@Sql ='选择计数(*)Cnt进入#Temp2来自'+ TableName +'其中'+ @columnname +'不为空和'+ @columnname&lt;&gt; '''''
Exec的(@sql)
然后检查#Temp2是否有大于0的值,如果这是你想要的,你可以使用被提取的@id来更新你的#Temp表。将结果放入标量变量而不是临时表是首选但不能记住最好的方法,并且使用临时表允许您使用更新连接,因此在我看来这很好。
https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/ http://www.sommarskog.se/dynamic_sql.html
答案 2 :(得分:0)
找到一种从模式中提取所有非空表的方法,然后加入我创建的初始临时表。
select A.tablename, B.[row_count]
from (select * from #test) A
left join
(SELECT r.table_name, r.row_count, r.[object_id]
FROM sys.tables t
INNER JOIN (
SELECT OBJECT_NAME(s.[object_id]) table_name, SUM(s.row_count) row_count, s.[object_id]
FROM sys.dm_db_partition_stats s
WHERE s.index_id in (0,1)
GROUP BY s.[object_id]
) r on t.[object_id] = r.[object_id]
WHERE r.row_count > 0 ) B
on A.[TableName] = B.[table_name]
WHERE ROW_COUNT > 0
order by b.row_count desc
答案 3 :(得分:0)
这个 - bitmask计算列如何检查NULLability。位掩码中的值告诉您列是否为NULL。计算基数2.
CREATE TABLE FindNullComputedMask
(ID int
,val int
,valstr varchar(3)
,NotEmpty as
CASE WHEN ID IS NULL THEN 0 ELSE 1 END
|
CASE WHEN val IS NULL THEN 0 ELSE 2 END
|
CASE WHEN valstr IS NULL THEN 0 ELSE 4 END
)
INSERT FindNullComputedMask
SELECT 1,1,NULL
INSERT FindNullComputedMask
SELECT NULL,2,NULL
INSERT FindNullComputedMask
SELECT 2,NULL, NULL
INSERT FindNullComputedMask
SELECT 3,3,3
SELECT *
FROM FindNullComputedMask