SQL查询的奇怪行为

时间:2013-02-28 06:58:19

标签: sql sql-server sql-server-2012

我写了一个查询(这是该查询的最简单形式)

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) 

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

2 个答案:

答案 0 :(得分:4)

您需要将其更改为

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

答案 1 :(得分:3)

如果忽略字符串查询部分中的详细信息,则执行此操作:

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

因为@query从开始就是空的,所以第一次迭代是:

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

' Go t(...) '。下一次迭代变为:

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

最终为' Go Go t(...) t(...) '

如您所见,Go首先添加到字符串中,查询最后添加,因此您最终会在字符串的开头添加所有Go