Select * into tmpABC from (Select 1 as col1,N'名字1' as col2, 'a' as col3
union select 2,N'名字1','a'
union select 3,N'名字1','b'
union select 4,N'名字1','c') adeclare @StrCol3 nvarchar(1000)
declare @StrSql nvarchar(1000)
declare @Col2 nvarchar(10)
declare @Col3 nvarchar(10)
declare @Counts nvarchar(10)
set @StrCol3=''
set @StrSql=''
declare cursor_out cursor local for Select col2,col3,count(*) as Counts from tmpABC group by col2,col3
open cursor_out
fetch next from cursor_out into @Col2,@Col3,@Counts
while @@fetch_status=0
begin
set @StrCol3=@StrCol3 + ' ,(Select count(*) from tmpABC where Col3= ''' + @Col3 + ''' and Col2=N''' + @Col2 +''') as ' + @Col3
fetch next from cursor_out into @Col2,@Col3,@Counts
end
CLOSE cursor_out
DEALLOCATE cursor_out
set @StrSql='Select Distinct col2' + @StrCol3 + ' from tmpABC'
exec(@StrSql)drop table tmpABC
union select 2,N'名字1','a'
union select 3,N'名字1','b'
union select 4,N'名字1','c') adeclare @StrCol3 nvarchar(1000)
declare @StrSql nvarchar(1000)
declare @Col2 nvarchar(10)
declare @Col3 nvarchar(10)
declare @Counts nvarchar(10)
set @StrCol3=''
set @StrSql=''
declare cursor_out cursor local for Select col2,col3,count(*) as Counts from tmpABC group by col2,col3
open cursor_out
fetch next from cursor_out into @Col2,@Col3,@Counts
while @@fetch_status=0
begin
set @StrCol3=@StrCol3 + ' ,(Select count(*) from tmpABC where Col3= ''' + @Col3 + ''' and Col2=N''' + @Col2 +''') as ' + @Col3
fetch next from cursor_out into @Col2,@Col3,@Counts
end
CLOSE cursor_out
DEALLOCATE cursor_out
set @StrSql='Select Distinct col2' + @StrCol3 + ' from tmpABC'
exec(@StrSql)drop table tmpABC
set @s='create table 表名('
select distinct @s=@s+quotename(mc)+' varchar(100),' -- 这里指定字段类型
from 表
set @s=left(@s,len(@s)-1)+')'
print(@s)
不过你很厉害,原来认为肯定要用游标才可以实现这个功能。
你这么简单就搞掂,佩服佩服
declare @s nvarchar(4000)
set @s='create table 表名('
select @s=@s+quotename(mc)+' varchar(100),' -- 这里指定字段类型
from 表
group by mc
set @s=left(@s,len(@s)-1)+')'
print(@s)
set @s='create table 表名('
select @s=@s+quotename(mc)+' varchar(100),' -- 这里指定字段类型
from(select distinct mc from 表)a
set @s=left(@s,len(@s)-1)+')'
print(@s)
hw VARCHAR(11),
hwbh VARCHAR(10),
huowname VARCHAR(20)
)
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000001', '1001', '一号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000002', '1002', '二号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000003', '2001', '三号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000004', '2002', '四号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000006', '3001', '五号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000011', '3002', '六号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000012', '4001', '七号库')
GOINSERT INTO [huoweizl] ([hw], [hwbh], [huowname])
VALUES
('HWI00000013', '4002', '八号库')
GO然后执行declare @s nvarchar(4000)
set @s='create table 表名('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from(select distinct huowname from huoweizl)a
set @s=left(@s,len(@s)-1)+')'
print(@s)
得出create table 表名([八号库] varchar(100),[二号库] varchar(100),[六号库] varchar(100),[七号库] varchar(100),[三号库] varchar(100),[四号库] varchar(100),[五号库] varchar(100),[一号库] varchar(100))这里有一个问题就是我没有办法按货位名称排序,这个表里还有一个字段可以排序hwbh。但是我不知道怎么才可以使他排序。请高手指点
declare @s nvarchar(4000)
set @s='create table 表名('
select @s=@s+quotename(mc)+' varchar(100),' -- 这里指定字段类型
from 表
group by mc,id
order by id --按ID排序
set @s=left(@s,len(@s)-1)+')'
print(@s)
declare @s nvarchar(4000)
set @s='create table #aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec @s
select #aa错误信息
服务器: 消息 207,级别 16,状态 3,行 9
列名 '#aa' 无效。高手们,可以解决这个问题吗?
declare @s nvarchar(4000)
set @s='create table 表名('
select @s=@s+quotename(huowname)+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,id
order by id --按ID排序
set @s=left(@s,len(@s)-1)+')'
print(@s)
set @s='create table #aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec (@s) ---要加括号
select #aa
declare @s nvarchar(4000)
set @s='create table 表名('
select @s=@s+quotename(huowname)+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,id
order by id --按ID排序
set @s=left(@s,len(@s)-1)+')'
print(@s)exec (@s) --加括号
用了你的语句,头也不痛了,腿也不酸了。感谢
set @s='create table #aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,hw
order by hw
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec (@s)
select #aa
还是提示没有表#aa
set @s='create table #aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,hw
order by hw
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec (@s)
select * from #aacreate table #aa([一号库] varchar(100),[二号库] varchar(100),[三号库] varchar(100),[四号库] varchar(100),[五号库] varchar(100),[六号库] varchar(100),[七号库] varchar(100),[八号库] varchar(100))
服务器: 消息 208,级别 16,状态 1,行 10
对象名 '#aa' 无效。
服务器: 消息 208,级别 16,状态 1,行 10
对象名 '#aa' 无效。
如果要引用#aa,你隻有在動態字串中引用,在動態字串執行完後,在外部引用必定會出錯的,所以如果要想在動態字串執行完後在外部引用動態字串中創建的臨時表,唯一的方法就是在動態字串中創建全局臨時表,即:
declare @s nvarchar(4000)
set @s='create table ##aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,hw
order by hw
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec (@s)
select * from ##aa
可以创建全局临时表,即加两个#,如:##aa
这样在执行完动态SQL语句后,仍旧可以在当前连接中使用##aa,一旦连接结束,全局临时表也会被系统自动清除。
如:declare @s nvarchar(4000)
set @s='create table ##aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,hw
order by hw
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec (@s)select * from ##aa
不推荐使用全局临时表,下面语句创建了局部临时表,并在动态SQL语句执行select返回记录集declare @s nvarchar(4000)
set @s='create table #aa('
select @s=@s+quotename(rtrim(huowname))+' varchar(100),' -- 这里指定字段类型
from huoweizl
group by huowname,hw
order by hw
set @s=left(@s,len(@s)-1)+')'
print(@s)
exec (@s + ' select * from #aa')