2013-02-28 81 views
3

我写了一个查询(这是查询的最简单的形式)怪异的行为

declare @tbl1 table(name varchar(50)) 
declare @tbl2 table(name varchar(50)) 
declare @query varchar(600) 
set @query = '' 

insert into @tbl1 
select 'a' union select 'b' union select 'c' union select 'd' union select 'e' 

insert into @tbl2 
select '1' union select '2' union select '3' union select '4' union select '5' 

select 
@query = 
' Go ' + 
@query + 
tbl1.name + ' (' + 
substring(
(
    select ', ' + tbl2.name 
    from @tbl2 as tbl2 
    for xml path('') 
), 3, 5000) + ') ' 
from @tbl1 as tbl1 

print @query 

我期待一个结果,这样

GO a (1, 2, 3, 4, 5) GO b (1, 2, 3, 4, 5) GO c (1, 2, 3, 4, 5) GO d (1, 2, 3, 4, 5) GO e (1, 2, 3, 4, 5) 

但是,这意味着查询这个返回我

Go Go Go Go Go a (1, 2, 3, 4, 5) b (1, 2, 3, 4, 5) c (1, 2, 3, 4, 5) d (1, 2, 3, 4, 5) e (1, 2, 3, 4, 5) 

有人可以请解释这个结果给我,我不明白这一点。

回答

3

如果在字符串的查询部分忽略的细节,你这样做:

@query = ' Go ' + @query + 't(...) ' 

@query是从开始空,第一次迭代是:

@query = ' Go ' + '' + 't(...) ' 

这是' Go t(...) '。接下来的迭代变为:

@query = ' Go ' + ' Go t(...) ' + 't(...)' 

其结束为' Go Go t(...) t(...) '

如您所见,Go首先添加到字符串中,查询最后添加,所以最后所有Go都在字符串的开头。

+0

thanx为解释,哥们。现在明白了 – yogi 2013-02-28 07:25:36

4

您需要将其更改为

select 
@query = 
@query + 
' Go ' +  
tbl1.name + ' (' + 
substring(
(
    select ', ' + tbl2.name 
    from @tbl2 as tbl2 
    for xml path('') 
), 3, 5000) + ') ' 
from @tbl1 as tbl1 
+0

+1快速回复。 thanx – yogi 2013-02-28 07:26:08