我写了一个查询(这是该查询的最简单形式)
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)
有人可以向我解释这个结果我不明白这一点。
答案 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
。