Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过移除光标来拼写查询_Sql_Sql Server 2005 - Fatal编程技术网

Sql 通过移除光标来拼写查询

Sql 通过移除光标来拼写查询,sql,sql-server-2005,Sql,Sql Server 2005,我有这样的疑问 declare @tmpTable Table(id int) insert into @tmpTable(id) values (3) insert into @tmpTable(id) values (5) insert into @tmpTable(id) values (11) declare @tmp int declare @finalString varchar(MAX) DECLARE c1 CURSOR READ_ONLY FOR SELECT

我有这样的疑问

 declare @tmpTable Table(id int)
 insert into @tmpTable(id) values (3)
 insert into @tmpTable(id) values (5)
 insert into @tmpTable(id) values (11)

 declare @tmp int
 declare @finalString varchar(MAX)

 DECLARE c1 CURSOR READ_ONLY FOR SELECT ID FROM @tmpTable
 OPEN c1
 FETCH NEXT FROM c1 INTO @tmp
 set @finalString=cast(@tmp as varchar)
 FETCH NEXT FROM c1 INTO @tmp
 WHILE @@FETCH_STATUS = 0
 begin
  set @finalString=@finalString+','+cast(@tmp as varchar)
  FETCH NEXT FROM c1 INTO @tmp
 end    
 close c1
 deallocate c1  

 select @finalString
我想从表列值创建格式为3,5,11的字符串,这段代码有效,但有更好的方法吗?

当然-将此方法与FOR XML PATH结合使用:

返回以下内容的输出:

3,5,11

您可以使用CTE或xquery

CTE:
with t1(rowNum, id) as
(
    select rowNum, id from Temp1
),
t2(rowNum, str) as
(
    select 1, cast(id as varchar(250)) from t1 where rowNum=1
    union all
    select t1.rowNum, str || ',' || cast(t1.id as varchar(3)) from t1,t2
    where t2.rowNum+1 = t1.rowNum
)
select str from t2 order by rownum desc FETCH FIRST 1 ROWS ONLY;

对有几种方法。建议您搜索……例如:
CTE:
with t1(rowNum, id) as
(
    select rowNum, id from Temp1
),
t2(rowNum, str) as
(
    select 1, cast(id as varchar(250)) from t1 where rowNum=1
    union all
    select t1.rowNum, str || ',' || cast(t1.id as varchar(3)) from t1,t2
    where t2.rowNum+1 = t1.rowNum
)
select str from t2 order by rownum desc FETCH FIRST 1 ROWS ONLY;