SQL 处理长度超过8000 的字符串
-- =============================================
-- Author: sunbird69
-- Create date: 2007/10/26
-- =============================================
/**//*
问题描述:
平常有时候会对表中某个字段连成了一个字符串的操作,但varchar(8000)最大只能放8000长度的字符串,如果处理超过8000的字符串时,
应该如何处理,下面针对此提供了一个解决方案,以前看过类似的文章,整理了一下。方案可以根据表的状况动态的创建需求变量的个数。
*/
-- 创建测试数据,可以修改变量@rc来改变输入数据大小
if exists(select * from sys.objects where object_id=object_id(N'Tb') and type in (N'u'))
begin
drop table Tb
end
create table Tb
(
Tname varchar(300)
)
-- 设置测试数据
declare @c int,
@rc int
select @c=0, -- 循环变量
@rc=10000 -- 设置的行数
while @c<@rc
begin
select @c=@c+1
insert into Tb values('This is a SQL test'+cast(@c as varchar)) -- 创建数据
end
declare @i int, -- 每个变量可以存放多少个数据行
@j int -- 整个表需要多少变量来存放所有的数据行
select @i=max(len(Tname)) from Tb -- 获取所以数据行中需求字段长度最大的值
set @i=7800/@i -- 每个变量可以存放的行数,设置为7800,因为在得到的字符串有可能存放间隔符如','等
print @i -- 测试
select @j=count(*)/@i from Tb -- 得到需求变量的个数,设置为7800,因为在其中有可能存放间隔符如','等
print @j -- 测试
if object_id('tempdb..#') is not null -- 创建临时表
begin
drop table #
end
select id=identity(int,0,1), -- 设置一个自增字段,为分组作准备
Tname, -- 需要的字段
gid=0 -- 分组初始为0
into # from Tb
update # set gid=id/@i -- 设置分组的值
declare @ds varchar(8000), -- 需要字义所以变量的字符串
@hs varchar(8000), -- 给需要的所以变量设置初值
@es varchar(8000), --
@cs varchar(8000), -- 给所以变量逐个设置值
@ts varchar(8000), -- print 打印测试
@ic varchar(10), -- 需求变量编号
@ss varchar(8000) -- select 测试结果
-- 设置变量的初始值
select @ds='',
@hs='select ',
@cs='',
@ts='',
@ss=''
while @j>=0
begin
select @ic=cast(@j as varchar), -- 转换类型
@j=@j-1, -- 控制循环
@ds='@'+@ic+' varchar(8000),'+@ds, -- 设置需求定义变量字符串
@hs=@hs+'@'+@ic+'='''',', -- 给需要的所以变量设置初值的字符串
@cs='select @'+@ic+'=@'+@ic+'+Tname + '','' from # where gid='+@ic+char(13)+@cs, -- 给需求变量逐个设置值
@ts=@ts+'print '+'@'+@ic+';', -- 打印测试字符串
@ss=@ss+'select '+'@'+@ic+' as content'+@ic+';' -- select 测试字符串
-- @ts='+@'+@ic
end
select @ds='declare '+left(@ds,len(@ds)-1)+char(13), -- 增加定义前缀declare
@hs=left(@hs,len(@hs)-1)+char(13), -- 去多余字符
@cs=left(@cs,len(@cs)-1) -- 去多余字符
print @ds -- 测试
print @hs -- 测试
print @cs -- 测试
print @ts -- 测试
print @ss -- 测试
-- 执行结果测试
exec(@ds+@hs+@cs+@ts+@ss)
-- Author: sunbird69
-- Create date: 2007/10/26
-- =============================================
/**//*
问题描述:
平常有时候会对表中某个字段连成了一个字符串的操作,但varchar(8000)最大只能放8000长度的字符串,如果处理超过8000的字符串时,
应该如何处理,下面针对此提供了一个解决方案,以前看过类似的文章,整理了一下。方案可以根据表的状况动态的创建需求变量的个数。
*/
-- 创建测试数据,可以修改变量@rc来改变输入数据大小
if exists(select * from sys.objects where object_id=object_id(N'Tb') and type in (N'u'))
begin
drop table Tb
end
create table Tb
(
Tname varchar(300)
)
-- 设置测试数据
declare @c int,
@rc int
select @c=0, -- 循环变量
@rc=10000 -- 设置的行数
while @c<@rc
begin
select @c=@c+1
insert into Tb values('This is a SQL test'+cast(@c as varchar)) -- 创建数据
end
declare @i int, -- 每个变量可以存放多少个数据行
@j int -- 整个表需要多少变量来存放所有的数据行
select @i=max(len(Tname)) from Tb -- 获取所以数据行中需求字段长度最大的值
set @i=7800/@i -- 每个变量可以存放的行数,设置为7800,因为在得到的字符串有可能存放间隔符如','等
print @i -- 测试
select @j=count(*)/@i from Tb -- 得到需求变量的个数,设置为7800,因为在其中有可能存放间隔符如','等
print @j -- 测试
if object_id('tempdb..#') is not null -- 创建临时表
begin
drop table #
end
select id=identity(int,0,1), -- 设置一个自增字段,为分组作准备
Tname, -- 需要的字段
gid=0 -- 分组初始为0
into # from Tb
update # set gid=id/@i -- 设置分组的值
declare @ds varchar(8000), -- 需要字义所以变量的字符串
@hs varchar(8000), -- 给需要的所以变量设置初值
@es varchar(8000), --
@cs varchar(8000), -- 给所以变量逐个设置值
@ts varchar(8000), -- print 打印测试
@ic varchar(10), -- 需求变量编号
@ss varchar(8000) -- select 测试结果
-- 设置变量的初始值
select @ds='',
@hs='select ',
@cs='',
@ts='',
@ss=''
while @j>=0
begin
select @ic=cast(@j as varchar), -- 转换类型
@j=@j-1, -- 控制循环
@ds='@'+@ic+' varchar(8000),'+@ds, -- 设置需求定义变量字符串
@hs=@hs+'@'+@ic+'='''',', -- 给需要的所以变量设置初值的字符串
@cs='select @'+@ic+'=@'+@ic+'+Tname + '','' from # where gid='+@ic+char(13)+@cs, -- 给需求变量逐个设置值
@ts=@ts+'print '+'@'+@ic+';', -- 打印测试字符串
@ss=@ss+'select '+'@'+@ic+' as content'+@ic+';' -- select 测试字符串
-- @ts='+@'+@ic
end
select @ds='declare '+left(@ds,len(@ds)-1)+char(13), -- 增加定义前缀declare
@hs=left(@hs,len(@hs)-1)+char(13), -- 去多余字符
@cs=left(@cs,len(@cs)-1) -- 去多余字符
print @ds -- 测试
print @hs -- 测试
print @cs -- 测试
print @ts -- 测试
print @ss -- 测试
-- 执行结果测试
exec(@ds+@hs+@cs+@ts+@ss)
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 #temp FROM(
SELECT DISTINCT name FROM [syscolumns] WHERE name>N'')a
--分组临时表
UPDATE a SET @i=id/i,g=@i
FROM #temp a,(SELECT i=3800/MAX(LEN(a)) FROM #temp)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 #temp
EXEC(N'+@sqlhead+N'+'+@sql4+N'+N'+@sqlend+N')')
--删除临时表
DROP TABLE #temp
,@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 #temp FROM(
SELECT DISTINCT name FROM [syscolumns] WHERE name>N'')a
--分组临时表
UPDATE a SET @i=id/i,g=@i
FROM #temp a,(SELECT i=3800/MAX(LEN(a)) FROM #temp)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 #temp
EXEC(N'+@sqlhead+N'+'+@sql4+N'+N'+@sqlend+N')')
--删除临时表
DROP TABLE #temp
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。