很经常我们都要在sql中拼凑字符串,如果需要的评凑的目标字符串的来源都已经在一个表中,那很简单,我们只要写个类似的语句,就可以搞定。
但是如果我们的数据来源是一个子查询,情况会怎么样呢?
Msg 1033, Level 15, State 1, Line 12
除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
上面的第二个sql,得到的结果有不是我们想要的。
难道我们就束手待毙?不,我们还有表变量。
ok,讨厌的1033错误消失了,我们要的结果也拿到了。
declare
@Va1
varchar
(
500
);
set @Va1 = '' ;
select @Va1 = @Va1 + ' ,[ ' + ColumnName + ' ] '
from
ItemColumn
where year = 2008
and month = 1
order by SortID desc
print @Va1
比如输出为:
,[总分],[主题检测],[常规检测],[扣分项],[总体评价],[无推诿],[环境设施],[业务能力],[服务规范]set @Va1 = '' ;
select @Va1 = @Va1 + ' ,[ ' + ColumnName + ' ] '
from
ItemColumn
where year = 2008
and month = 1
order by SortID desc
print @Va1
但是如果我们的数据来源是一个子查询,情况会怎么样呢?
declare
@str
varchar
(
500
)
set @str = ''
-- 以下写法,会报错
select @str = @str + Value + ' ; '
from
(
select Value, [ Order ] from dbo.SMS_SpecialConfigData data
join dbo.SMS_Config co
on co.ItemID = data.ConfigID
where Time = ' 2008-5-12 ' and OrgCode = ' GZ/ '
order by [ Order ]
) temp
-- 或如下,但又得不到我们想要的结果
select @str = @str + Value + ' ; '
from
(
select Value, [ Order ] from dbo.SMS_SpecialConfigData data
join dbo.SMS_Config co
on co.ItemID = data.ConfigID
where Time = ' 2008-5-12 ' and OrgCode = ' GZ/ '
) temp
order by [ Order ]
上面的第一个sql,执行会报错,错误如下:
set @str = ''
-- 以下写法,会报错
select @str = @str + Value + ' ; '
from
(
select Value, [ Order ] from dbo.SMS_SpecialConfigData data
join dbo.SMS_Config co
on co.ItemID = data.ConfigID
where Time = ' 2008-5-12 ' and OrgCode = ' GZ/ '
order by [ Order ]
) temp
-- 或如下,但又得不到我们想要的结果
select @str = @str + Value + ' ; '
from
(
select Value, [ Order ] from dbo.SMS_SpecialConfigData data
join dbo.SMS_Config co
on co.ItemID = data.ConfigID
where Time = ' 2008-5-12 ' and OrgCode = ' GZ/ '
) temp
order by [ Order ]
Msg 1033, Level 15, State 1, Line 12
除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
上面的第二个sql,得到的结果有不是我们想要的。
难道我们就束手待毙?不,我们还有表变量。
declare
@t
table
(
strs varchar ( 200 )
)
declare @str varchar ( 500 )
set @str = ''
insert into @t
select Value from dbo.SMS_SpecialConfigData data
join dbo.SMS_Config co
on co.ItemID = data.ConfigID
where Time = ' 2008-5-12 ' and OrgCode = ' GZ/ '
order by [ Order ]
select @str = @str + strs + ' ; '
from @t
print @str
(
strs varchar ( 200 )
)
declare @str varchar ( 500 )
set @str = ''
insert into @t
select Value from dbo.SMS_SpecialConfigData data
join dbo.SMS_Config co
on co.ItemID = data.ConfigID
where Time = ' 2008-5-12 ' and OrgCode = ' GZ/ '
order by [ Order ]
select @str = @str + strs + ' ; '
from @t
print @str
ok,讨厌的1033错误消失了,我们要的结果也拿到了。