+stuff(@tbname,2,2,N ' ')
+N ' as
select [xtype] ' '
union all
select N ' ', ' '+quotename([name])+ ' '=sum(case [name] when N ' '
+quotename([name], ' ' ' ' ' ' ' ')
+ ' ' then [colid] else 0 end) ' '
from(select distinct [name] from [syscolumns] where name <> N ' 'xtype ' ')a
union all
select N ' 'from [syscolumns] group by [xtype] ' ' '
exec(@s)
--生成创建视图的文件,注意使用了文件:c:\temp.txt
set @s=N 'bcp " '+@tbname+N ' " out "c:\ '+@tbname+N ' " /S " '
+@servername+N ' " /U " '+@username+N ' " /P " '+@pwd+N ' " /w '
exec master..xp_cmdshell @s,no_output
--调用isql生成数据处理视图
set @s=N 'osql /S " '+@servername
+case
when @username=N ' ' then N ' " /E '
else N ' " /U " '+@username+N ' " /P " '+@pwd+N ' " '
end
+N ' /d " '+db_name()+N ' " /i "c:\ '+@tbname+ ' " '
exec master..xp_cmdshell @s,no_output
--删除临时文件
set @s=N 'del "c:\ '+@tbname+ ' " '
exec master..xp_cmdshell @s,no_output
--调用视图,显示处理结果
set @s=N 'drop table '+@tbname+N '
select * from '+stuff(@tbname,2,2,N ' ')+N '
drop view '+stuff(@tbname,2,2,N ' ')
exec(@s)
/*--方法总结
优点:程序自动处理,不存在判断错误的问题
缺点:复杂,经过的步骤多,容易出错,而且需要一定的操作员权限
--*/
--*/
--/*-- 方法3. 多个变量处理,综合了方法1,2的优点,解决了方法1中需要人为判断,增加变量的问题,排除了方法2,需要权限和过程复杂的问题
DECLARE @sqlhead nvarchar(4000),@sqlend nvarchar(4000)
,@sql1 nvarchar(4000),@sql2 nvarchar(4000),@sql3 nvarchar(4000),@sql4 nvarchar(4000)
,@i int,@ic nvarchar(10)
--生成数据处理临时表
SELECT id=IDENTITY(int,0,1),
g=0,
a=CAST(N ', '
+QUOTENAME([name])
+N '=SUM(CASE [name] WHEN N '
+QUOTENAME(name,N ' ' ' ')
+N ' THEN [colid] ELSE 0 END) '
as nvarchar(4000))
INTO # FROM(
SELECT DISTINCT name FROM [syscolumns] WHERE name> N ' ')a
--分组临时表
UPDATE a SET @i=id/i,g=@i
FROM # a,(SELECT i=3800/MAX(LEN(a)) FROM #)b
SET @ic=@i
--生成数据处理语句
SELECT
@sqlhead=N ' ' ' '
+REPLACE(N 'SELECT [xtype] ',N ' ' ' ',N ' ' ' ' ' ')
+ ' ' ' ',
@sqlend=N ' ' ' '
+REPLACE(N ' FROM [syscolumns] GROUP BY [xtype] ',N ' ' ' ',N ' ' ' ' ' ')
+N ' ' ' ',
@sql1=N ' ',@sql2=N ' ',@sql3=N ' ',@sql4=N ' '
WHILE @ic> =0
SELECT
@sql1=N ',@ '+@ic+N ' nvarchar(4000) '+@sql1,
@sql2=N ',@ '+@ic+N '=N ' ' ' ' '+@sql2,
@sql3=N ',@ '+@ic
+N '=CASE g WHEN '+@ic
+N ' THEN @ '+@ic+N '+a ELSE @ '+@ic
+N ' END '+@sql3,
@sql4=N '+@ '+@ic+@sql4,
@ic=@ic-1
SELECT
@sql1=STUFF(@sql1,1,1,N ' '),
@sql2=STUFF(@sql2,1,1,N ' '),
@sql3=STUFF(@sql3,1,1,N ' '),
@sql4=STUFF(@sql4,1,1,N ' ')
--执行
EXEC(N 'DECLARE '+@sql1+N '
SELECT '+@sql2+N '
SELECT '+@sql3+N ' FROM #
EXEC(N '+@sqlhead+N '+ '+@sql4+N '+N '+@sqlend+N ') ')
--删除临时表
DROP TABLE #
------解决方案--------------------