日期:2014-05-18  浏览次数:20596 次

麻烦高手改下代码。非常感谢

代码作用描述: 依次得出 某张表中所有字段 非NULL的有效记录数。代码可以执行,但是显示结果 只有 COUNT出来的数字
我想要的结果是如下:
ID 9898
NAME 9723
XINGBIE 9898
NIANLIANG 7433
BEIZHU 1223

就是最后输出 字段名 有效记录数 并且能现在在一个网格内。 可以直接粘贴进 EXCEL。
代码如下: 高手帮忙看下

[code=SQL][/code]
ALTER PROC [dbo].[cx_tab] (@tablename varchar(100))
AS
begin
set nocount on 
declare @sqlstring varchar(200)
declare @table_col varchar(100)
declare cur_table cursor for
select name from syscolumns where id in (select id from sysobjects where name=@tablename)
open cur_table
fetch next from cur_table into @table_col
while @@fetch_status=0
begin
select @sqlstring ='select count(*) from '+@tablename+' where '+@table_col+' is not NULL '
exec (@sqlstring)

fetch next from cur_table into @table_col
--DEALLOCATE CUR_table
end
DEALLOCATE CUR_table
set nocount off
end
[code=SQL][/code]
我新手,我是做ORACLE的,SQLSERVER 2005环境,麻烦高手给改一下,我分不多。如果觉得分不够,请高手私下联系我

------解决方案--------------------
不用游标行不?

SQL code
ALTER PROC [dbo].[cx_tab] (@tablename varchar(100)) 
AS 
declare @sql varchar(8000)
select 
  @sql=isnull(@sql+' union all ','')
  +'select ''' 
  +name+''',count(1) as cnt from '+@tablename+' where '+name+' is not null'
from syscolumns 
where id=object_id(@tablename)
exec (@sql)
go

--exec cx_tab 'tb'

------解决方案--------------------
SQL code

DECLARE @sql        VARCHAR(100)
DECLARE @table      VARCHAR(100)
SET @table = 'tb'--改为你的表名
SET @sql = ''
SELECT  @sql = @sql + ',COUNT(' + name + ') AS [' + name + ']' FROM sys.columns WHERE OBJECT_NAME(object_id) = @table
SELECT @sql = STUFF(@sql,1,1,'')
SELECT @sql
EXEC ('SELECT ' + @sql + ' from ' + @table)