取表中非空列
最近在做用友U8的项目,U8中的数据库表字段太多,有的时候只需要知道非空列的值,所以就写了一下的一个方法,取得非空列
SQL2005
1declare @HeadTaleName nvarchar(50)
2declare @codeColName nvarchar(50)
3declare @codeColValue nvarchar(50)
4
5set @HeadTaleName = 'zpurRkdHead'
6set @codeColName = 'ccode'
7set @codeColValue = '0000000077'
8
9declare @cColumnName nvarchar(50)
10declare @cColumnsNotNULL nvarchar(1000)
11declare @i int
12declare @count int
13declare @temp nvarchar(50)
14declare @sqls nvarchar(4000)
15
16set @cColumnName = ''
17set @cColumnsNotNULL =''
18set @temp = ''
19set @i = 0
20set @count = 0
21
22declare mycursor cursor for select name from syscolumns where id = object_id(@HeadTaleName) --为所获得的数据集指定游标
23open mycursor --打开游标
24fetch next from mycursor into @cColumnName --开始抓第一条数据
25while(@@fetch_status=0) --如果数据集里一直有数据
26begin
27 set @sqls = 'select @temp = '+ @cColumnName + ' from ' + @HeadTaleName + ' where ' + @codeColName + '= ' + @codeColValue
28 exec sp_executesql @sqls,N'@temp nvarchar(50) output', @temp output
29 if(@temp is not null)
30 begin
31 set @cColumnsNotNULL =@cColumnsNotNULL + @cColumnName + ','
32 set @i = @i + 1
33 end
34 fetch next from mycursor into @cColumnName --跳到下一条数据
35end
36 set @cColumnsNotNULL = @cColumnsNotNULL + ','---如果 expression 的数据类型为 varchar(max)、nvarchar(max) 或 varbinary(max),则为 bigint;否则为 int。
37 set @cColumnsNotNULL = substring(@cColumnsNotNULL,0,len(@cColumnsNotNULL)-1)
38close mycursor --关闭游标
39deallocate mycursor --删除游标
40
41select @i, @cColumnsNotNULL
42
43set @sqls = 'select ' + @cColumnsNotNULL +' from '+ @HeadTaleName + ' where ' + @codeColName + '= ' + @codeColValue
44exec(@sqls)
45
1declare @HeadTaleName nvarchar(50)
2declare @codeColName nvarchar(50)
3declare @codeColValue nvarchar(50)
4
5set @HeadTaleName = 'zpurRkdHead'
6set @codeColName = 'ccode'
7set @codeColValue = '0000000077'
8
9declare @cColumnName nvarchar(50)
10declare @cColumnsNotNULL nvarchar(1000)
11declare @i int
12declare @count int
13declare @temp nvarchar(50)
14declare @sqls nvarchar(4000)
15
16set @cColumnName = ''
17set @cColumnsNotNULL =''
18set @temp = ''
19set @i = 0
20set @count = 0
21
22declare mycursor cursor for select name from syscolumns where id = object_id(@HeadTaleName) --为所获得的数据集指定游标
23open mycursor --打开游标
24fetch next from mycursor into @cColumnName --开始抓第一条数据
25while(@@fetch_status=0) --如果数据集里一直有数据
26begin
27 set @sqls = 'select @temp = '+ @cColumnName + ' from ' + @HeadTaleName + ' where ' + @codeColName + '= ' + @codeColValue
28 exec sp_executesql @sqls,N'@temp nvarchar(50) output', @temp output
29 if(@temp is not null)
30 begin
31 set @cColumnsNotNULL =@cColumnsNotNULL + @cColumnName + ','
32 set @i = @i + 1
33 end
34 fetch next from mycursor into @cColumnName --跳到下一条数据
35end
36 set @cColumnsNotNULL = @cColumnsNotNULL + ','---如果 expression 的数据类型为 varchar(max)、nvarchar(max) 或 varbinary(max),则为 bigint;否则为 int。
37 set @cColumnsNotNULL = substring(@cColumnsNotNULL,0,len(@cColumnsNotNULL)-1)
38close mycursor --关闭游标
39deallocate mycursor --删除游标
40
41select @i, @cColumnsNotNULL
42
43set @sqls = 'select ' + @cColumnsNotNULL +' from '+ @HeadTaleName + ' where ' + @codeColName + '= ' + @codeColValue
44exec(@sqls)
45